【问题标题】:Updating Backbone model requires calling .set twice更新 Backbone 模型需要调用 .set 两次
【发布时间】:2015-08-06 22:04:21
【问题描述】:

我有一个显示某些服务器当前状态的页面。但是,当我尝试更新这些状态时,我必须先使用虚拟值调用 model.save()model.set(),然后再使用实际值调用 model.set(),否则设置将失败。

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

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);
        });
    });
},

myModel.ajaxCall:

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

根据我的观点,我希望它会在模型​​更改时更新。

myView.initialize:

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

myView.render:

render: function() {
    this.$el.html(this.template(this.model.toJSON()));
    this.delegateEvents();
    return this;
},

但是当我从updatingFunction 中删除初始的.set 时,视图无法更新。在那里并没有真正伤害任何东西(据我所知),所以我可以保持原样,但我更愿意让它以它应该的方式工作(或者至少理解我为什么需要这样做)。

servers 变量是在我的 fetch 函数中创建的, myModel.fetch:

fetch: function(){
    switch(this.get("environment")){
        case "env1":
        servers = [
        {
            "name":'env1-server1',
            "ip":'1.2.3.4',
            "heartbeat_indicator":""
        },
        {
            "name":'env2-server2',
            "ip":'1.2.3.5',
            "heartbeat_indicator":""
        }
        ];
        break;

        case "env2":
        servers = [
        {
            "name":'env2-server1',
            "ip":'2.2.3.4',
            "heartbeat_indicator":""
        },

        {
            "name":'env-server2',
            "ip":'2.2.3.5',
            "heartbeat_indicator":""
        }
        ];
        break;

        default:
        servers= [];
    }

    this.set("servers", servers);
    return servers;
},

【问题讨论】:

    标签: jquery ajax backbone.js


    【解决方案1】:

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

    不过,我想我可以大胆猜测一下正在发生的事情。

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

    您的问题暗示第二个set 对视图产生了预期的效果,这让我相信您已经实施了一些方法来使用您在问题中未提及的模型更改来更新视图。

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

    that.set('servers', servers);
    

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

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

    ...那么servers 属性已设置为您设置的值。

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

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

    【讨论】:

    • 我有 this.listenTo(this.model, "change", this.render) 在模型更改时处理更新视图。我将获取视图的相关部分和我的模型的更多部分,以显示从创建到我的问题所在位置的 servers 变量,并用这些更新我的问题。
    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2018-07-02
    • 2021-09-24
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多