Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何更新现有模型的属性?_Backbone.js - Fatal编程技术网

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

Backbone.js 如何更新现有模型的属性?,backbone.js,Backbone.js,我想更新从另一个视图传递的现有模型的rank属性。但是,我得到了错误未捕获的TypeError:Object#没有方法“set” 在视图的初始化部分,我有: this.collection = new tgcollection({model : this.options.model }); 我将更新属性值的函数定义为: updateModel: function(){ var val= $("#textbox_id").val(); console.log(val); conso

我想更新从另一个视图传递的现有模型的rank属性。但是,我得到了错误未捕获的TypeError:Object#没有方法“set”

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

this.collection = new tgcollection({model : this.options.model });
我将更新属性值的函数定义为:

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;

}))

我喜欢一个好的谜团。根据我所看到的,这里是我最好的猜测。问题可能更为严重。你打电话的地方:

this.collection = new tgcollection({model : this.options.model });
这个.options.model
可能不是您想象的那样。在该视图之前查看正在实例化并传入this.options.model的视图会很有帮助。顺便说一句,通过将模型和集合传递到视图中,您可以将其缩短为
此。模型
模型、集合和其他一些工具的特殊之处在于,一旦传入,它们会直接附加到视图中

我假设在您的
updateModel()
中,以下各项似乎有效:

console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);
错误出现在
集合()
上,而不是上面的几行。所以假设您传入了一个模型。还是你?我的猜测是,
this.options.model
实际上只是模型的一个json对象。这可能解释了为什么在字符串化模型时,您会在控制台中“看到”该模型,但在调用该模型上的
set()
时,您会看到它

不要使用JSON.stringify来测试this.options.model,只需尝试
console.log(this.options.model)
。嗯,你真的不需要测试。主干在这个对象上找不到
set()
,这是一个很明显的迹象。如果您在控制台中没有看到主干模型的复杂性,那么它不是一个模型

另外,对于测试和调试特别是模型,我倾向于使用
model.toJSON()
函数快速检查它是否是一个模型,并查看我期望的属性

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

就这样做吧

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

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

视图中的模型是通过this.model而不是this.options.model访问的。我们可以查看“Backbone.model”的代码以及如何设置“options.model”吗?我们可以查看使用此
updateModel
-函数的代码吗?编辑:添加了函数更新和options.model