4

我想更新从另一个视图传递的现有模型的等级属性。但是,我收到错误Uncaught TypeError: Object # has no method 'set'

在视图的初始化部分,我有:

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;

});

4

2 回答 2

11

做就是了

this.model.set({"rank": val});

代替

this.options.model.set({"rank": val});

视图中的模型通过 this.model 而不是 this.options.model 访问

于 2012-08-22T19:14:43.180 回答
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()函数快速检查它是否是模型,并且我看到了我期望的属性。

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

于 2012-08-22T18:49:34.383 回答