model.set之后的Model.fetch:意外行为还是bug?

时间:2012-05-22 22:13:47

标签: javascript backbone.js

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

当你写m.get("attr") = "bar";时,你的意思是m.get("attr") == "bar";(请注意双等号)?如果没有,那么该代码不会做你认为它做的事情。

在任何情况下,问题很可能是在检查值时fetch()调用尚未完成。当我输入时,“mu太短”的评论中注明了这一点。 :)

答案 2 :(得分:0)

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

  1. 使用$.ajax为REST路由设置对服务器的m.id调用。
  2. AJAX成功处理程序通过parse传递返回的数据,然后将结果传递给set
  3. 因此fetch几乎是延迟setset没有做任何会忽略null属性值的特殊情况。在您的情况下,fetch应该是m.set({id: 2, attr: null}),并且有时间延迟。

    我想你看到了这个:

    1. 调用m.fetch()并启动AJAX请求。
    2. 您看m.get('attr')但看不到您期望的null
    3. AJAX请求完成并将m.get('attr')更改为null
    4. 为您的提取添加success处理程序:

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

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

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

      看看会发生什么。