我有一个rest API,它能够生成具有空值的对象键 此null值未在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)我该如何解决?
答案 0 :(得分:1)
好的......我看到发生了什么......在第一个例子中,您将var m设置为新的模型实例。在第二个示例中,您没有将m重置为新模型,只是设置id值 - 它仍然是第一个模型。这就是为什么你没有看到“null”的变化。
答案 1 :(得分:0)
当你写m.get("attr") = "bar";
时,你的意思是m.get("attr") == "bar";
(请注意双等号)?如果没有,那么该代码不会做你认为它做的事情。
在任何情况下,问题很可能是在检查值时fetch()调用尚未完成。当我输入时,“mu太短”的评论中注明了这一点。 :)
答案 2 :(得分:0)
我认为你有时间问题。 Backbone fetch
基本上是这样的:
$.ajax
为REST路由设置对服务器的m.id
调用。parse
传递返回的数据,然后将结果传递给set
。因此fetch
几乎是延迟set
而set
没有做任何会忽略null
属性值的特殊情况。在您的情况下,fetch
应该是m.set({id: 2, attr: null})
,并且有时间延迟。
我想你看到了这个:
m.fetch()
并启动AJAX请求。m.get('attr')
但看不到您期望的null
。m.get('attr')
更改为null
。为您的提取添加success
处理程序:
m.fetch({ success: function(m) { ... });
并查看其中的m.get('attr')
或绑定事件处理程序以等待attr
更改:
m.on('change:attr', function(m, attr) { ... });
m.fetch();
看看会发生什么。