Backbone: カスタムビュー属性は異なるインスタンス間で共有されます

作成日 2012年04月19日  ·  9コメント  ·  ソース: jashkenas/backbone

このフィドルをご覧ください: http

したがって、itemViewのインスタンスを10個作成し、addItemメソッドを呼び出して各itemViewに10個のアイテムを追加します。 各itemViewのitemArrayプロパティには10個のアイテムが必要です。 ただし、代わりに、itemArrayプロパティを共有し、100個のアイテムが含まれています。

問題は、backbone.viewがコンストラクターのカスタム属性をリセットしていないことである可能性があります。

question

最も参考になるコメント

はい、 itemArrayitemViewプロトタイプのプロパティであるため、 itemViewすべてのインスタンスで共有されます。 インスタンスに独自のitemArrayを持たせたい場合は、 initializeまたはコンストラクターで設定する必要があります。

var ItemView = Backbone.View.extend({

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

  ...

});

全てのコメント9件

はい、 itemArrayitemViewプロトタイプのプロパティであるため、 itemViewすべてのインスタンスで共有されます。 インスタンスに独自のitemArrayを持たせたい場合は、 initializeまたはコンストラクターで設定する必要があります。

var ItemView = Backbone.View.extend({

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

  ...

});

これがあなたが説明したことをするフィドルです: http

こんにちは@braddunbar

回避策として投稿したのと同じソリューションをすでに使用しましたが、それを行う必要はないようです。 かなり紛らわしい行動だと思いませんか?

プロトタイプでそれを使用することの用途を説明できますか(私はよくわかりません。現在の実装が間違っていると言っているわけではありません。理解できるように説明を求めているだけです)。

@spawnedcがフィドルで使用した方法ですべてのビューのプロパティを指定することがよくあります。これは、初期化メソッドでビューのプロパティを「オーバーライド」する必要がある場合に、ビューのプロパティが何であるかが明確になるためです。 。

サンプルアプリでは、ビューのプロパティはまったく同じ方法で指定されます(Todo.jsを参照)。 「テンプレート」変数も同じ方法で指定されますが、もちろん、これは不変の文字列であるため、この種の問題は発生しません。

動的ビュープロパティを指定する正しい方法は何ですか、確かに、initメソッドでそれらすべてをオーバーライドする必要があるわけではありません...?

プロトタイプでそれを使用することの用途を説明できますか

プロトタイプに可変プロパティ(配列、ハッシュなど)を配置することは、私の経験ではめったに役に立ちません(ただし、そうなる場合もあると思います)。

動的ビュープロパティを指定する正しい方法は何ですか、確かに、initメソッドでそれらすべてをオーバーライドする必要があるわけではありません...?

はい、クラス/コンストラクターの各インスタンスに可変値でプロパティを設定するには、コンストラクター(またはこの場合はコンストラクターから呼び出されるinitialize )で設定する必要があります。

例として、これはBackboneがBackbone.Modelインスタンスでプロパティ

私はそれが_brandのnew_master_ hostはインスタンスのような特性がリセットされます_all_期待_new_インスタンスを作成する場合@braddunbar。 これは予想される動作ではありませんか、それとも何かが足りませんか?

こんにちは@braddunbar

プロトタイプに可変プロパティ(配列、ハッシュなど)を配置することは、私の経験ではめったに役に立ちません(ただし、そうなる場合もあると思います)。

この場合、BacboneがitemArrayで行っていることとまったく同じではありませんか? itemArrayはプロトタイプ上にあります。これが、私たちが経験している動作が起こっている理由ですか?

@spawnedcの最後のステートメントに100%同意します。 「兄弟」ビューのインスタンス間でプロパティが共有されることは期待していません。

実際には、コンストラクターでリセットされない限り、どのプロパティもリセットされません。 これらは常に、同じコンストラクターによって作成されたすべてのインスタンスによって共有される同じプロトタイププロパティです。

var A = function(){};
var a = new A();

var B = function(){};
B.prototype = a;
a.constructor = B;

var b1 = new B();
var b2 = new B();

console.log(b1.foo); // undefined
console.log(b2.foo); // undefined

a.foo = [1];

console.log(b1.foo); // [1]
console.log(b2.foo); // [1]

console.log(b1.foo === b2.foo); // true

あなたが興味を持っているなら、ここに素晴らしい説明があり

この場合、BacboneがitemArrayで行っていることとまったく同じではありませんか? itemArrayはプロトタイプ上にあります。これが、私たちが経験している動作が起こっている理由ですか?

丁度。 そのため、プロトタイププロパティとしてではなく、 initializeitemArrayを作成することをお勧めします。

@braddunbar説明とリンクをありがとう-それは一方ではまだ一種の奇妙な(そして予期しない)振る舞いですが、他方ではビュー間でプロパティを共有することは完全に理にかなっています。

JavaScript Gardenの記事を読んで、すべてが明らかになると確信しています:)。

このページは役に立ちましたか?
0 / 5 - 0 評価