>我有一个 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
基本上是这样的:
- 使用 REST 路由的
m.id
设置对服务器的$.ajax
调用。 - AJAX 成功处理程序通过
parse
传递返回的数据,然后将结果传递给set
。
因此,fetch
几乎是一个延迟set
并且set
不会执行任何会忽略null
属性值的特殊操作。在您的情况下,fetch
应该是具有时间延迟的m.set({id: 2, attr: null})
。
我想你看到的是这个:
- 调用
m.fetch()
并启动 AJAX 请求。 - 你看着
m.get('attr')
,看不到你所期待的null
。 - AJAX 请求完成并将
m.get('attr')
更改为null
。
将success
处理程序添加到抓取:
m.fetch({ success: function(m) { ... });
并查看其中的m.get('attr')
或绑定事件处理程序以等待attr
更改:
m.on('change:attr', function(m, attr) { ... });
m.fetch();
看看会发生什么。