0

Backbone.jsで開発されたWebアプリケーションがあります。アプリケーションには、コンテンツビューを削除するボタンがいくつかありますが、押されたときにコンテンツモデルは削除されません。たとえば、同じボタンを複数回押すと、コンテンツは置き換えられますが、そのコンテンツのモデルは削除されません。どうすれば削除できますか?

他の別のボタンでコンテンツを削除する方法は知っていますが、同じボタン(または削除するのではなく追加する他のボタン)が押された場合にコンテンツを削除する方法がわかりません。
サンプルコード:HTML:

<button class="ShowCam"></button>
<button class="camClose"></button>
<button class="anotherButton"></button>

JS:

var camContent = Backbone.View.extend({
        el: "body",     
    events: {
        "click .ShowCam": "addContentCam", 
                "click .anotherButton": "otherAddContentFunction"                   
    },          
    initialize: function() {
        _.bindAll(this);
        this.model = new ContentCollection();
        this.model.on("add", this.contentAdded);
        this.model.on("remove", this.removeContentCam); 
    },                  
    addContentCam: function(event) {
        this.model.add({ modelName: "IPcam"});          
    contentAdded: function(content) {
        if (content.view == null) {
           var templ_name = 'cam';                                                  
           content.view = new ContentView({
                  model: content,
                  template: $.trim($("[data-template='"+ templ_name +"'] div").html() || "Template not found!")});
           $("div.camBox").empty(); 
           this.$el.find(".content").find("div.camBox").append(content.view.render().el);                                           
        }                   
    },  
    removeContentCam: function(content) {
        if (content.view != null) { 
            content.view.remove();              
        }
        content.clear();  //Clear the properties of the model   
    }   
}); 
var ContentView = Backbone.View.extend({
    tagName: "div",
    template: null,
    events: {
          "click .camClose": "removeView" 
    },
    initialize: function() {
        _.bindAll(this);
        this.template = this.options.template; 
    },
    render: function() {        
        this.$el.html(Mustache.render(this.template, this.model.toJSON())); 
        return this; 
    },
    removeView: function() {
        this.model.collection.remove(this.model); //Remove the model of the collection
    }
});
4

1 に答える 1

1

Javascript は、ガベージ コレクション システムを使用してメモリ管理を行います。これが意味することは、それへのすべての参照を削除するだけで何でも削除できるということです(技術的には、ガベージ コレクターが到達するまで実際には削除されませんが、本質的には削除されます)。

したがって、モデルを確実に削除したい場合は、特別なメソッドを呼び出す必要はなく、delete someView.modelそのモデルを参照するすべてのビュー (またはコード内の他の場所) で行う必要があります。

removeのメソッドを見れば、これらすべてを実際に実際に見ることができますBackbone.View。実際に行うことは (イベントのトリガー以外に) 内部メソッドの呼び出しだけであることがわかります_removeReference。そして、何をし_removeReferenceますか?これ:

  if (this == model.collection) {
    delete model.collection;
  }
  // (there's also an event-related line here)

とはいえ、古いビューを置き換えるために新しいビューを作成していて、両方とも同じモデルを持っている場合は、最初から新しいビューを作成するべきではありません。このような状況を処理するより標準的なバックボーンの方法は、(新しいビューを作成する代わりに) ビューで render を再呼び出しすることです。

于 2013-01-11T01:17:35.033 に答える