Так что я неоднократно сталкивался с этой ситуацией: я пишу модуль с шаблоном, но не могу вызвать одну функцию из другой (прототипированной) функции.Шаблон модуля JS и вызов другой функции
;(function($,window,documnet,undefined) {
var id,
_defaults = { };
var MyObject = function(element,options) {
this.el = element;
this.opt = $.extend({},_defaults,options);
this.init(); // works fine
};
MyObject.prototype.init = function() {
var self = this;
self.id = localStorage.getItem('myobject_id');
if(self.id !== null) {
$('#myobject_id').val(self.id);
}
};
MyObject.prototype.fetch = function() {
var self = this;
var data = {
action: 'program_fetch',
program_idx: $('#program_idx').val()
};
// assume session is valid and has a uri in opt.callback
$.post(session.opt.callback, data).complete(function(r){
var prog = JSON.parse(r.responseText).program;
self.id = prog.id;
$('#myobject_id').val(self.id); // this works
self.display(); // this does not work
});
}; /* fetch */
MyObject.prototype.display = function() {
var self = this;
$('#myobject_id').val(self.id);
}; /* display */
$.fn.MyObject = function(options) {
return this.each(function(){
if(!$.data(this,'plugin_MyObject')) {
$.data(this,'plugin_MyObject', new MyObject(options));
}
});
};
window.myobject = new MyObject();
})(jQuery,window,document);
Из того, что я понимаю, функции должно принести быть установки значения окна, прикрепленный экземпляр MyObject, так что, когда функция дисплея() вызывается, она имеет значение, чтобы поместить в поле ввода HTML, идентифицированное #myobject_id.
Что действительно происходит, так это состояние гонки, в течение которого значение, присвоенное self.id, является жизнеспособным, но оставляя объем обратного вызова .complete (..), значение MyObject.id больше недействительно ,
Как я должен ссылаться на эти вещи, чтобы добиться настойчивости в данных экземпляра в моем объекте?
Это должно сработать. Вы уверены, что проблема не в неправильном селекторе в «MyObject.prototype.display» («$ myobject_id» вместо «#myobject_id»)? – jmar777
Кроме того, вам не нужна строка 'window.myobject = new MyObject();', если вы только создаете экземпляр MyObject' через шаблон плагина jQuery. – jmar777
См. Мой «Ответ» ниже. Получается частично, по крайней мере, я маскировал свойства MyObject, используя var self = this; в пределах каждой функции. – RSAdmin