1

我有一个休息 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)我该如何解决?

4

3 回答 3

1

好的...我知道发生了什么...在第一个示例中,您将 var m 设置为新的模型实例。在第二个示例中,您没有将 m 重置为新模型,只是设置 id 值 - 它仍然是第一个模型。这就是为什么您没有看到“null”的变化。

于 2012-05-22T23:11:29.750 回答
0

当您写作m.get("attr") = "bar";时,您m.get("attr") == "bar";的意思是(注意双等号)?如果不是,那么该代码不会像您认为的那样做。

在任何情况下,问题很可能是当您检查该值时 fetch() 调用尚未完成。当我打字时,“mu太短”在评论中指出了这一点。:)

于 2012-05-22T23:17:31.487 回答
0

我认为你有时间问题。Backbonefetch基本上是这样的:

  1. 使用REST 路由设置$.ajax对服务器的调用。m.id
  2. AJAX 成功处理程序将返回的数据传递parseset.

所以 afetch几乎是延迟的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处理程序添加到您的 fetch 中:

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

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

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

看看会发生什么。

于 2012-05-22T23:25:57.587 回答