Model.fetch after a model.set:意外行为或错误



>我有一个 rest API,它能够生成具有空值的对象键。
此空值不会显示在 model.attributes 中。

这里有一个例子:

服务器可以产生{id: 1, attr: "someValue"}{id: 2, attr: null}

现在,如果我运行以下代码,一切都很好:

m = new MyModel({id: 1});
m.fetch();
m.get("attr"); // "bar";
m = new MyModel({id: 2});
m.fetch();
m.get("attr"); // undefined;

如果我运行以下内容,则视图中的渲染函数有问题。
要了解原因,请查看以下代码:

m = new MyModel({id: 1});
m.fetch({
    success: function () {
         m.get("attr"); // "bar";
    }
});
m = new MyModel({id: 2});
m.fetch({
    success: function () {
         m.get("attr"); // "bar"; // actually it should be undefined or null
    }
});

我的问题是:
1(为什么我会有这种行为?
2( 我该如何解决?

好的...我明白发生了什么...在第一个示例中,您将 var m 设置为新的模型实例。在第二个示例中,您不会将 m 重置为新模型,而只是设置 id 值 - 它仍然是第一个模型。这就是为什么您没有看到"null"的更改。

当你写m.get("attr") = "bar";时,你的意思是m.get("attr") == "bar";(注意双等号(? 如果不是,那么该代码不会执行您可能认为它执行的操作。

无论如何,问题很可能是当您检查值时 fetch(( 调用尚未完成。当我输入这个时,评论中注意到"mu 太短了"。:)

我认为您有时间问题。骨干fetch基本上是这样的:

  1. 使用 REST 路由的m.id设置对服务器的$.ajax调用。
  2. AJAX 成功处理程序通过 parse 传递返回的数据,然后将结果传递给 set

因此,fetch几乎是一个延迟set并且set不会执行任何会忽略null属性值的特殊操作。在您的情况下,fetch应该是具有时间延迟的m.set({id: 2, attr: null})

我想你看到的是这个:

  1. 调用m.fetch()并启动 AJAX 请求。
  2. 你看着m.get('attr'),看不到你所期待的null
  3. AJAX 请求完成并将m.get('attr')更改为 null

success处理程序添加到抓取:

m.fetch({ success: function(m) { ... });

并查看其中的m.get('attr')或绑定事件处理程序以等待attr更改:

m.on('change:attr', function(m, attr) { ... });
m.fetch();

看看会发生什么。

最新更新