所以我反复遇到这种情况:我编写了一个模块模式对象,但无法从另一个(原型)函数中调用一个函数。
;(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);
据我了解, fetch 函数应该设置 MyObject 的窗口附加实例的值,以便在调用 display() 函数时,它有一个值可以放入 HTML 输入字段中,由#myobject_id 标识.
实际上似乎发生的是竞争条件,在此期间分配给 self.id 的值是可行的,但是离开 .complete(..) 回调的范围, MyObject.id 的值不再有效。
我应该如何调用这些东西来实现对象内实例数据的持久性?