我想更新从其他视图传递的现有模型的 rank 属性。但是,我收到错误未捕获TypeError:对象#没有方法'设置'。
在视图的初始化部分,我有:
this.collection = new tgcollection({model : this.options.model });
我定义了一个函数 updateModel ,旨在将属性值更新为:
updateModel: function(){
var val= $("#textbox_id").val();
console.log(val);
console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);
this.options.model.set({"rank": val});
this.render();
//
},
我哪里错了? 我可以在控制台中看到值和模型及其先前的属性值。
模特:
define(['jquery','underscore', 'backbone', 'deepmodel'],
function($,_, Backbone) {
var model = Backbone.DeepModel.extend({
// Default attributes for the model.
defaults : {
id: null,
rank: null,
},
initialize: function(){
_.bindAll(this,"update");
this.bind('change : cost', this.update);
},
update: function(){
console.log(this.get("cost"));
},
// Remove this model from *localStorage*.
clear : function() {
this.destroy();
},
});
return model;
});
答案 0 :(得分:11)
只做
this.model.set({"rank": val});
而不是
this.options.model.set({"rank": val});
视图中的模型可通过this.model访问,而不是this.options.model
答案 1 :(得分:0)
我喜欢一个很好的谜。根据我的看法,这是我最好的猜测。这个问题可能更进一步。你打电话的地方:
this.collection = new tgcollection({model : this.options.model });
this.options.model
可能不是您认为的那样。在实例化并传入this.options.model的视图之前看到视图会很有帮助。顺便说一句,随着模型和集合传递到视图中,您可以随时将其缩短为this.model
模型,集合,其他一些特殊之处在于它们在传入后直接附加到视图中。
我假设您的updateModel()
以下SEEM中有效:
console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);
错误出现在set()
上,而不是上面的行。所以假设你传入了一个模型。或者你呢?我猜测的是this.options.model
实际上是什么,只是模型的json对象。这可以解释为什么当你对其进行字符串化时,你会在控制台中“看到”该模型,但是当你在其上调用set()
时,Backbone就会抗议。
而不是JSON.stringify来测试this.options.model只需console.log(this.options.model)
。好吧,你不必真的测试。 Backbone无法在此对象上找到set()
的事实是一个告诉故事标志。如果您没有在控制台中看到Backbone模型的复杂性 - 它不是模型。
另外,为了测试和调试特别模型,我倾向于使用model.toJSON()
函数作为一个快速检查,它是一个模型,我看到了我期望的属性。
如果您有更多线索,请告诉我们。