更新Backbone模型需要两次调用.set

时间:2015-08-06 22:04:22

标签: jquery ajax backbone.js

我有一个显示某些服务器当前状态的页面。但是,当我尝试更新这些状态时,我必须首先使用虚拟值调用<span ng-if= "user.PhoneNumbers.AreaCode== ''">No Area Code Entered</span> <span ng-if= "user.PhoneNumbers.PhoneNumber== ''">No Phone Number Entered</span> <span ng-if="user.PhoneNumbers.AreaCode != ''">({{user.PhoneNumbers[0].AreaCode}}) {{user.PhoneNumbers[0].PhoneNumber | phonenumber}}</span> model.save(),然后使用实际值调用model.set(),否则该集将失败。

以下是我的模型中的相关功能: 的 myModel.updatingFunction:

model.set()

myModel.ajaxCall:

updatingFunction: function(){
    that = this;

    $.each(myServers, function(index, server){
        that.ajaxCall(server["url"]).done(function(resp, status, xhr){
            newStatus = $(resp).find("status").text();
            server["status"]=status;
            that.set("servers",[]); //view does not update if this is removed
            that.set("servers",servers);
        });
    });
},

根据我的观点,我希望每当模型发生变化时都会更新。

myView.initialize:

ajaxCall: function(url){
    return $.ajax({
        type: 'GET',
        url: url,
        dataType: 'xml'
    });
},

myView.render:

initialize: function () {
    this.listenTo(this.model,"change", this.render);
    this.render();  
},

但是当我从render: function() { this.$el.html(this.template(this.model.toJSON())); this.delegateEvents(); return this; }, 中删除初始.set时,视图无法更新。通过在那里做任何事情(据我所知)并没有真正伤害任何事情,所以我可以按原样保留它,但我更喜欢让它按照应有的方式工作(或者至少理解为什么我需要这样做。)

我的fetch函数中创建了updatingFunction变量, 的 myModel.fetch:

servers

1 个答案:

答案 0 :(得分:0)

从您的问题中不清楚您是否知道 set本身未能更新模型或视图的事实。

但是,我想我可以冒一些猜测发生了什么。

默认情况下,模型更改时

Backbone 会更新您的视图。因此,当模型通过插件或手动(使用事件或其他方式)更改时,您必须触发一些更新视图的方法。

您的问题意味着第二个set对视图产生了预期的影响,这让我相信您已经实现了一些更新视图的方法,其中包含您在问题中未提及的模型更改。

所以我推断,如果你这样做并且没有效果:

that.set('servers', servers);

并执行此操作并查看视图更新:

that.set('servers', []);
that.set('servers', servers);

...然后servers属性已设置为您将其设置为的值。

因此,您只需要重新渲染。

有助于查看有关该视图的更多信息,以及在servers调用中查看that.set('servers', servers);的来源。