3

配列変数を持つBackboneViewクラスがあるため、説明できないシナリオ/バグが発生しましたが、変数値は再インスタンス化した後も存続します。バックボーンビューには次の設定があります。

var TestView = Backbone.View.extend({
    a:"",
    b:"",
    items:[],
    initialize:function(){

    },
    add:function(value){
        this.items.push(value);
    }
});

クラスをインスタンス化する方法は次のとおりです。

this.formView = new TestView();
this.formView.add('halo');
this.formView.a = 'abc';

this.formView = new TestView();
this.formView.add('test');
this.formView.b = 'bcd';

console.log("a - " + this.formView.a);
console.log("b - " + this.formView.b);
console.log("items - ");
console.log(this.formView.items);
​   

結果:

a -  
b - bcd 
items -  ["halo", "test"] 

驚いたことに、配列変数'items'は存続し、['halo'、'test']の両方を一緒に表示しました。ただし、通常の変数ではありません。

これがJsFiddleリンクです。

初期化関数で配列をクリアすることで解決できます。

    initialize:function(){
      this.items = [];  
    },

しかし、これがバグなのか、何かを誤解したのかを知りたいのですが。

4

1 に答える 1

7

さて、問題はトリッキーですが、それは説明があります。

まず第一に、クラスコンテキストでインスタンス変数を定義することはお勧めできません。これは、これを使用して行っていることです。

var TestView = Backbone.View.extend({
  a: "",
  b: "",
  items: []
});

これが、Model.defaultsが存在する理由の1つです。あなたはむしろこれをすべきです:

var TestView = Backbone.View.extend({
  initialize: function(){
    this.a = "";
    this.b = "";
    this.items = [];
  }
});

サンプルコードで起こっていることは、のすべての新しい参照がとの同じインスタンスをTestView共有することです。これは、一方のインスタンスで配列を変更すると、もう一方のインスタンスに反映されるためです。StringArray

最もトリッキーなこと、そしてあなたが観察するのに機敏だったのは、共有動作が文字列では発生していないように見えますが、実際には発生しているということです。

何が起こっているのかというと、これを行うと次のようになります。

this.formView.a = 'abc';

Stringインスタンスを変換するのではなく、新しいインスタンスに置き換えて、元のStringインスタンスが変更されないようにします。

1つのインスタンスで文字列を操作TestViewし、他のインスタンスで変更が反映されることを確認する例を示したいのですが、文字列をインプレースで操作するJSStringメソッドTestViewが見つかりません。

于 2012-08-23T11:46:42.087 に答える