如何更新现有模型的属性?

时间:2012-08-22 14:07:19

标签: backbone.js

我想更新从其他视图传递的现有模型的 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;

});

2 个答案:

答案 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()函数作为一个快速检查,它是一个模型,我看到了我期望的属性。

如果您有更多线索,请告诉我们。

相关问题