删除Backbone视图和关联的DOM元素

时间:2014-06-06 16:04:46

标签: backbone.js backbone-views backbone-events

我的代码结构如下:

hTrackView contains:  
    measureView contains:  
        //several instatianted views, not stored in a collection or an array  
        measureRepView0,  
        measureRepView1,  
        ...

measureRepViews(mRVs)上有许多变量,其中一些与mRV的其他实例共享。

根据以下情况,当我们添加,删除或编辑其中一个共享变量时,就会出现问题:

  • 我们删除了其中一个mRV,其余部分保持不变,顺序相同而没有删除。
  • 我们添加一个mRV并将其附加到其他mRV。
  • 我们更改了其中一个共享'全球'变量和所有mRV都使用新的变量表示法重新渲染。

我们已经看到了包含bind()bindAll()的示例,因此在父testView的初始化中我们实现了这一点:

initialize: function(options){
    // Given a list of variables 'options', set the variables of this to those of options
    // e.g. this.x = options.x
    if (options) {
        for (var key in options) {
            this[key] = options[key];
        }

        this.el = '#measure-container-'+options.parent.cid;
    }

    this.newMeasureRepViews = [];

    _.bindAll(this, 'render');
    this.listenTo(this.measureRepresentations, 'remove', _.bind(this.render, this));  
    this.listenTo(this.measureRepresentations, 'add', _.bind(this.render, this));  
    this.model.on('change:scale', _.bind(this.render, this));
    this.collectionOfMeasures.on('add', _.bind(this.render, this));
    this.collectionOfMeasures.on('remove', _.bind(this.render, this));

    this.render();
}

在这个程序中可能存在竞争的哲学或代码结构,抱歉,我们正在学习。当我们添加或删除并且DOM正确更新时会出现真正的问题,但是我们会忘记Backbone View对象本身。例如,从一个干净的平板开始,我们有一个mRV,cid为26(我们从视图本身拉出它并将它放在DOM上的id中)。然后我们添加一个mRV,现在我们有&# 39; C55'和' c57'我很好,Backbone删除了26,因为它重新实现了它的55版本。但是,当我们试图操纵55时,它出现了一个未定义的错误。我们追溯到这个特定mRV属性的问题,并注意到应用程序中有3个Backbone Views [26,55,57](其中应该有两个[55,57])。那么在给出三种情况(添加,删除,更改)的情况下,我如何正确设置以删除骨干视图和DOM表示?

供参考:

在measureView.js中:

render: function(){
     var compiledTemplate = _.template( MeasureTemplate, measureTemplateParameters );

     // If we are adding a rep, clear the current reps, then add the template
     while(this.newMeasureRepViews.length >0) {
        var deleting = this.newMeasureRepViews.pop();
        deleting.stopListening();
        delete deleting;
     }

     // I'm assuming this isn't correct, and the DOM should be coupled to the View, so that when the View is deleted the DOM is as well.
     // Maybe we call this.destroy() or this.remove() here?
     $(this.el).html(''); // clear the html
     // append the new completed compiled template
     $(this.el).append( compiledTemplate )

     ...
  }

回顾一下,我想知道

  1. 当前的代码结构能否实现我尝试删除/添加/更改视图的功能?
  2. 我们使用destroy()还是remove()?

0 个答案:

没有答案