backbone.js模型和集合开销

时间:2012-09-30 20:48:32

标签: backbone.js backbone.js-collections

当我从服务器获取模型或集合时,除非我进行字符串化然后重新解析,否则我无法访问模型的属性。据推测,模型本身有一些来自backbone.js的额外开销?请注意,在下面的代码中,我可以顺序执行stringify / parse,这应该给出与我开始时相同的结果。然而,显然我通过执行这两个步骤来消除一些多余的信息,因为我的模型的属性现在与以前不同。当然,我不需要通过这两个步骤来访问我的模型属性,对吧?

Eg.  
thismodel = /// assume this came from server fetch
alert(thismodel.name);    // DOES NOT WORK - undefined

jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name);     // WORKS

2 个答案:

答案 0 :(得分:1)

Backbone Model对象不是普通的旧JavaScript对象。他们将自己的属性保存在an internal hash中。要访问name属性,您可以执行以下操作:

alert(thismodel.attributes.name);

或者更好地使用the get() method

alert(thismodel.get("name"));

将模型转换为JSON然后再返回时它起作用的原因是JSON.stringify调用the toJSON() method,它从内部属性hash 创建一个JSON字符串,这意味着当您解析该字符串时,您将获得一个普通的旧JavaScript对象 - 这与Backbone Model对象不同。

答案 1 :(得分:0)

首先,您是否尝试访问模型或响应的属性?

alert(thismodel.name)开始,你似乎要找到模型的属性而不是属性。如果您正在寻找模型属性,那么您可能需要alert(this.model.get('name'))

如果您确实要使用model.name,那么基本上问题可能在于您如何解析数据。比如说服务器中的JSON就像这个{'name':'Jimmy'}。

虽然发送的原始JSON的model.response在object.name下命名为“Jimmy”,但Backbone会自动将其转换为模型属性,除非另有指示(例如modelObj.attributes.name)你可以使用get()函数。

如果一切正常,您应该可以非常简单地访问模型数据。

E.g。取

var model = new MyModel();
    model.id = 1;
    model.fetch({
        success: function(model, response) {
            console.log(model.get('name'));  // The model name attribute
            console.log(response.name);  // The RAW response name property
        }
    });

或者您的服务器可能没有将数据作为JSON数据发回。服务器响应是content-type="application/json"吗?

要检查的一些事情。