【问题标题】:Marionette CollectionView re-render when a model is removed from the collection当模型从集合中移除时,Marionette CollectionView 会重新渲染
【发布时间】:2015-03-27 23:27:45
【问题描述】:

我发现了我的问题,但我想知道为什么,以便我可以(希望)更好地理解 Marionette/backbone。

问题下面的代码确实会在删除项目时更新视图:

var MainView = Marionette.ItemView.extend({
    template: "#sample-template",
    events :{
        "click #remove" : "remove"
    },
    remove: function(){            
        this.trigger("property:remove", this.model);
    }
});
var CollectionView = Marionette.CollectionView.extend({
    itemView: MainView,
    initialize: function(){
        this.on("itemview:property:remove", function(view, model){
            alert(this.collection.length);
            this.collection.remove(model);
            alert(this.collection.length);
        });
    }
});

A JsFiddle to view in all its glory

修复下面的代码确实按预期更新了视图:

var MainView = Marionette.ItemView.extend({
    template: "#sample-template",
    triggers :{
        "click #remove" : "property:remove"
    },
});

var CollectionView = Marionette.CollectionView.extend({
    itemView: MainView,
    initialize: function(){
        this.on("itemview:property:remove", function(view, model){
            alert(this.collection.length);
            this.collection.remove(view.model);
            alert(this.collection.length);
        });
    }
});

The jsFiddle

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    Backbone.View 定义了一个名为remove 的方法,用于从 DOM 中删除视图。您的第一个示例覆盖了该方法。

    如果您将 remove 重命名为 removeIt 之类的名称,名称冲突就会消失,并且代码会按预期工作。无论如何,我认为第二种方法更适合这种情况。

    【讨论】:

    • 就是这样。我喜欢愚蠢的事情把你搞得一团糟。是的,第二个选项更干净。谢谢。
    【解决方案2】:

    对于遇到此问题的任何人,请记住 Marionette 2.x 将 itemview 更改为 childview。把我绊倒了一点。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多