2017-11-09 3 views
0

私はプロパティーがarr:[]のコンポーネントを持っていますが、initでthis.get('arr').push('value one');でこのプロパティに値をプッシュしています。このコンポーネントを複数回使用すると、arrの値は他のすべてのコンポーネントに保持されます。 例: 私はコンポーネントのinitにある値をプッシュするとthis.get('arr').push('value one')です。 私はこのコンポーネントを一度使用するとうまく動作しますが、2回目の使用/インスタンスでは、arrはプッシュする前に既に長さ1です。同じコンポーネントの複数のインスタンスに配列値が保持されています

このひねりのコンソールを見てください。

https://ember-twiddle.com/8a6527aebf829ee1876bccb5e3ee47b1

奇数この振る舞いですか、このように動作するようになっていますか?

+0

あなたがHTTP読むことができます:// WWWを。 cerebris.com/blog/2012/03/06/understanding-ember-object/理解を深めるため – kumkanillam

答えて

1

この動作は、使用している例に基づいて予測されますが、望ましくない場合があります。エンバーガイドから:https://guides.emberjs.com/v2.16.0/object-model/classes-and-instances/

  • どのEmber.Objectで直接定義された配列やオブジェクトは、そのクラスのすべてのインスタンス間で共有されています。

  • init()の間にこれらの配列とオブジェクトのプロパティを初期化することをお勧めします。これにより、各インスタンスが一意になります。

あなたの例では、以下の実装オススメ:

arr: null, 

init() { 
    this.set('arr', []); 
    // ....... 
} 

EmberTwiddle下記のザ・上記の他、 "ラフ" の例を提供します。https://ember-twiddle.com/1006a702aa09c6d365bd1a46ca283059?openFiles=components.my-component.js%2C

+0

ご清聴ありがとうございます。これが予想される場合、オブジェクトは、親なしでコンポーネント間で直接(サイド・ウェイ)通信するために使用できます。これはコンポーネントのトップダウン・パラダイムとは異なりますか? –

+0

これはJavaScriptの仕組みの結果であると考えられます。オブジェクトと配列は、メモリ内のその位置への参照によって渡されます。他の投稿は私がここで行うよりもはるかに優れた仕事をしてくれます。 私の基本的な説明は、コンポーネントの新しいインスタンスが作成されると、コンポーネントの後続のインスタンスはすべて、初期インスタンスのプロパティと同じ参照を持つプロパティを持つことになります。フレームワークにかかわらず、フレームワーク設計者はJavaScriptの継承機能を回避する必要がないと考えるかもしれないので、これは注意するべきことです。 –

関連する問題