0

我有简单的视图,显示对话框。为什么Backbone.View对象仍然保留在内存中?

Backbone.View.prototype.completeRemove = function(){ 
    this.undelegateEvents(); 
    this.remove(); 
    delete this.$el; 
    delete this.el; 
    console.log('completely removed') 
} 

MdApp.dialogBox = Backbone.View.extend({ 

    defaults: { 
     text: __('No text provided'), 
     buttonText: __('Ok'), 
     callback: function(){ 
      return null; 
     }, 
     el: $('#app-panel'), 
     type: 'error', 
     cancellable: false, 
     cancelText: __('No'), 
     picture: pic('default') 
    }, 

    el: '<div class="dialog-box">', 

    template: _.template($('#dialog-box-template').html()), 

    events: { 
     'click .confirm' : 'confirm', 
     'click .cancel' : 'cancel' 
    }, 

    initialize: function(){ 
     this.model = _.extend(this.defaults, this.model); 
     this.render(); 
    }, 

    render: function(){ 
     var model = this.model; 
     this.$el.html(this.template(model)); 
     model.el.append(this.el); 
    }, 

    confirm: function(){ 
     var model = this.model; 
     var view = this; 
     this.completeRemove(); 
     model.callback(); 
    }, 

    cancel: function(){ 
     this.completeRemove(); 
    } 
}); 

它有它自己的默认值。每次我初始化新对话框时,它的值在每次对话框调用之间都会持续存在。例如,当我调用对话首次:

new MdApp.dialogBox({model:{ 
     text: __('Do you really wanna delete this?'), 
     buttonText: __('Unfortunately yes'), 
     callback: function(){ 
      //some callback 
     }, 
     cancellable: true, 
     cancelText: __('No'), 
     picture: pic('confirm delete') 
    }}); 

在那之后,我调用另一个对话框,不cancellable属性,因此它应该使用默认的(这是false),但它保持真实。这适用于所有其他财产。为什么会发生?

回答

2

fine manual

延伸_.extend(destination, *sources)

复制所有在源属性对象转移到目的地对象,并返回目的地对象。

这意味着_.extend(o, ...)修改为o。所以,当你这样做:

this.model = _.extend(this.defaults, this.model); 

你有效地这样做:

for(k in this.model) 
    this.defaults[k] = this.model[k]; 
this.model = this.defaults; 

defaults连接到原型,以你的,其实,改变将由每个实例共享的defaultsMdApp.dialogBox。这就是为什么你最终会遇到粘性属性:你将所有各种this.model s合并到视图原型中的defaults

你可以做这样的:

// Merge into an empty object to avoid altering this.defaults 
this.model = _.extend({}, this.defaults, this.model); 

或者你可以使用_.defaults代替_.extend

默认值在零和未定义的属性_.defaults(object, *defaults)

填写对象,其值为默认对象,并返回对象。一旦财产被填补,进一步的违约将不会生效。

所以,你可以这样做:

_(this.model).defaults(this.defaults); 

这将改变就地this.model所以你的观点会被假定它全资拥有this.model,并且不会有到该对象的任何外部引用。

相关问题