【问题标题】:backbone.js model and collection overhead骨干.js 模型和收集开销
【发布时间】:2012-09-30 20:48:31
【问题描述】:

当我从服务器获取模型或集合时,我无法访问模型的属性,除非我将其字符串化然后重新解析。大概模型本身有一些来自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

【问题讨论】:

    标签: backbone.js backbone.js-collections


    【解决方案1】:

    Backbone 模型对象不是普通的旧 JavaScript 对象。他们将属性保存在an internal hash 中。要访问name 属性,您可以这样做:

    alert(thismodel.attributes.name);

    或者更好的是使用the get() method:

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

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

    【讨论】:

      【解决方案2】:

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

      alert(thismodel.name) 看来,您正在寻找模型的属性而不是属性。如果您正在寻找模型属性,那么您可能想要alert(this.model.get('name'))

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

      虽然model.response 发送的原始 JSON 在 object.name 下具有“Jimmy”命名空间,但 Backbone 会自动将其转换为模型属性,除非另有说明(例如 modelObj.attributes.name),此时您' d 使用get() 函数。

      如果一切正常,您应该能够相当简单地访问模型数据。

      例如获取

      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" 吗?

      需要检查的一些事项。

      【讨论】:

        猜你喜欢
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 2012-07-31
        相关资源
        最近更新 更多