はい、 itemArray
はitemView
プロトタイプのプロパティであるため、 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はプロトタイプ上にあります。これが、私たちが経験している動作が起こっている理由ですか?
丁度。 そのため、プロトタイププロパティとしてではなく、 initialize
にitemArray
を作成することをお勧めします。
@braddunbar説明とリンクをありがとう-それは一方ではまだ一種の奇妙な(そして予期しない)振る舞いですが、他方ではビュー間でプロパティを共有することは完全に理にかなっています。
JavaScript Gardenの記事を読んで、すべてが明らかになると確信しています:)。
最も参考になるコメント
はい、
itemArray
はitemView
プロトタイプのプロパティであるため、itemView
すべてのインスタンスで共有されます。 インスタンスに独自のitemArray
を持たせたい場合は、initialize
またはコンストラクターで設定する必要があります。