我在JavaScript方法中向参数objekt添加值时遇到问题。
我试图为Backbone.Model.fetch()
方法添加额外的成功回调,我的模型如下所示:
models.Settings = Backbone.Model.extend({
url: "path/to/settings.json",
dataLoaded: function() {
this.set({
data: new collections.Data( this.get("data") )
});
},
fetch: function() {
var
cb;
if(!arguments.length) arguments[0] = {};
if(arguments[0].hasOwnProperty('success')) {
cb = arguments[0].success;
}
arguments[0].success = function() {
this.dataLoaded();
if(typeof cb === 'function') cb.apply(undefined, arguments);
}.bind(this);
models.Settings.__super__.fetch.apply(this, arguments);
}
});
只要将值(任何值)传递给fetch()
,代码就可以正常工作。当arguments对象最初为空时会发生此问题。我可以设置arguments[0]
和success
值,as I'm supposed to。但回调永远不会运行。
我错过了什么?
答案 0 :(得分:2)
arguments
属性是一个对象,而不是数组,这意味着当您设置arguments[0] = {};
时,它看起来像(http://jsfiddle.net/nikoshr/n93wfm8a/)
{
0: {}
}
但是,models.Settings.__super__.fetch.apply
需要一个数组(或至少一个length
属性与内容匹配)并且不会得到它。
最苛刻的是,设置length
属性:
if(!arguments.length) {
arguments[0] = {};
arguments.length = 1;
}
稍微好一点,用数组
初始化arguments
if(!arguments.length) {
arguments = [{}];
}
重写整个内容以利用方法的签名model.fetch([options])
并使用Function.prototype.call
fetch: function(opts) {
var cb;
opts = opts || {};
if (opts.hasOwnProperty('success')) {
cb = opts.success;
}
opts.success = function() {
this.dataLoaded();
if(typeof cb === 'function') cb.apply(this, arguments);
}.bind(this);
Settings.__super__.fetch.call(this, opts);
}