【问题标题】:Backbonejs collection.fetch() enforce default model parametersBackbonejs collection.fetch() 强制执行默认模型参数
【发布时间】:2013-07-10 20:42:24
【问题描述】:

将 Backbonejs 升级到 1.0 后,从服务器获取集合会强制执行未响应的默认属性。

更具体地说,我创建了这个可以在jsfiddle 中验证的测试。

假设我们有一个具有默认属性的主干模型定义。属性text可以从服务器接收到JSON格式[{ "text": "updated", "id" : 1}],属性selected在客户端维护。

var Model = Backbone.Model.extend({
    defaults: function () {
        return {
            text: 'default',
            selected: false
        };
    }    
});

如果我们使用此设置并从服务器获取数据,它将正常工作。现在假设我们像这样在骨干集合中添加这个模型:

var Models = Backbone.Collection.extend({
    url: '/json/',
    model: Model
});

创建一个新的集合实例并填充fetch

var models = new Models();
models.fetch({
    update : true
});

之后,我们取集合中的一个模型并将selected 属性更改为true:

var model = models.get(1);
model.set('selected', true);

现在如果我们第二次调用集合fetch,即使响应中没有这样的值,主干也会将我们之前更改的属性清除为默认值false

models.fetch({
    update : true
});
model = models.get(1);

获取selected 值将返回false,而不是我们之前设置的true

model.get('selected');

解决方法:注释掉那些没有从服务器接收到的属性。

但在这种情况下,我们会从主干中丢失许多有用的功能。 这是 Backbonejs 1.0 中的回归还是我以错误的方式使用此模型?

【问题讨论】:

  • 我同意骨干网应该将接收到的属性合并到指定的默认值,但在这种情况下,我将 selected 值更改为 true 我们得到它之后来自服务器的模型。所以我们第二次从服务器获取数据时,selected 已经由初始化程序定义并由我更改。使用 Backbone.js 0.9.10 和完全相同的代码,在这个 jsfiddle 中的工作方式不同:http://jsfiddle.net/FH4Nj/,我期望的方式:默认值仅应用于缺失值,而不仅仅是不同。
  • 很多人争辩说这不是你应该使用 Backbone 的方式。人们喜欢保持模型中的数据非常纯净。
  • 但这就是他们在 Todo 示例中显示的方式!

标签: backbone.js backbone.js-collections backbone-model


【解决方案1】:

Backbone.js 1.0 中有一个回归,在当前 master 中已修复。

Closed issue

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多