2017-08-15 8 views
2

私はPolymerでdom-repeatを使用しています。対応するリストには、dom-repeatのリストがリセットされるたびに設定されるべき初期値が含まれる。しかし、リストの最初の要素が同じ初期値を保持している場合、リストを完全に空にしてから新しい値にリセットしても、値はリセットされません。ここに私の最小の例です:dom-repeat内の値をリセット

<dom-module id="console-app"> 
    <template> 
    <div id="command-selection"> 
     <paper-dropdown-menu id="command" label="Function"> 
     <paper-listbox slot="dropdown-content" selected="{{_commandIndex}}"> 
      <paper-item>A</paper-item> 
      <paper-item>B</paper-item> 
     </paper-listbox> 
     </paper-dropdown-menu> 
    </div> 

    <div id="parameters"> 
     <template is="dom-repeat" items="[[_parameterData]]"> 
     <parameter-block name="[[item.name]]" initial-value="[[item.initialValue]]" ></parameter-block> 
     </template> 
    </div> 
    </template> 

    <script> 
     class ConsoleApp extends Polymer.Element { 

      static get is() { 
       return 'console-app'; 
      } 



      static get properties() { 
       return { 
        _commandIndex: { 
         type: Number, 
         value: -1, 
         observer: '_onIndexChange' 
        }, 

        _parameterData: { 
         type: Array, 
         value:() => { return []; } 
        } 
       }; 
      } 

      _onIndexChange() { 
       this.set('_parameterData', []); 

       switch (this._commandIndex) { 
        case 0: 
         this.set('_parameterData', [ 
          { name: 'AAA', initialValue: '111'}, 
          { name: 'BBB', initialValue: '123'} 
         ]); 
         break; 

        case 1: 
         this.set('_parameterData', [ 
          { name: 'CCC', initialValue: '112'} 
         ]); 
         break; 

       } 
      } 
     } 

     customElements.define(ConsoleApp.is, ConsoleApp); 
    </script> 
</dom-module> 

パラメータブロック:

<dom-module id="parameter-block"> 
    <template> 
    <paper-input id="non-bool-value" label="[[name]]" 
       value="{{_value}}"></paper-input> 
    </template> 

    <script> 
     class ParameterBlock extends Polymer.Element { 

      static get is() { 
       return 'parameter-block'; 
      } 



      static get properties() { 
       return { 
        _value: { 
         type: String, 
         value:() => { return ''; } 
        }, 

        initialValue: { 
         type: String, 
         value:() => { return ''; }, 
         observer: '_onInitialValueChange' 
        }, 

        name: { 
         type: String, 
         value:() => { return ''; } 
        } 
       }; 
      } 



      _onInitialValueChange() { 
       this.set('_value', this.initialValue); 
      } 
     } 

     customElements.define(ParameterBlock.is, ParameterBlock); 
    </script> 
</dom-module> 

ドロップダウンメニューの変更のインデックスは、私が[]に_parameterDataをリセットし、その後_parameterDataに将来のすべての変更が評価されていることを前提としています場合には新しい要素として。しかし、リストは対応するリスナーが呼び出されず、前の初期値を覚えているようで、最初のテキスト要素の前回の変更は選択を変更しても111にリセットされないようです。私が異なる初期値を使用すると、すべて正常に動作するので、私はPolymerに何らかの理由で適切に要素をリセットする必要があると仮定しますが、どうすればよいでしょうか?

+0

ここにplnkrリンクがあります:http://plnkr.co/edit/IhX5oIOslskGMqqsW4A4?p=preview?間違っていることを詳しく説明できますか? – Ofisora

+0

@Ofisoraそのリンクをありがとう! - ドロップダウンでAを選択します - 最初のテキストフィールドを12345に変更します - ドロップボックスでBを選択します 最初のテキストフィールドの内容は12345のままで、111にリセットされません。私は_parameterData to []を新しい値に設定する前に、initialValueを ''に初期化してから '111'に変更した新しいパラメータブロックオブジェクトを作成します。これにより_onInitialValueChange関数がトリガされます。しかし、これは起こりませんし、テキストは同じままです。私たちの場合は12345です。 – Niels

+0

Ofisoraのリンクを試しましたか?または、問題を再現できるかどうかを確認するためにさまざまなブラウザを試しましたか? –

答えて

0

initialValueを観察しているだけなので、変更したinitialValueが異なるnameであることがアプリケーションに分かりません。そのため、割り当てたデフォルト値にリセットされません。

プロパティnameinitialValueの両方を観察する必要があります。私が提供plnkr linkを更新しました

_onInitialValueChange(name, initialValue) { 
    this.set('_value', this.initialValue); 
    } 

static get observers() { 
    return [ 
     '_onInitialValueChange(name, initialValue)' 
    ] 
} 

し、あなたの方法に:だから、あなたへのオブザーバーのコードを変更します。

+0

それで、私はそれを再初期化する前に配列を[]にセットしても問題ありませんか?私はこれが完全な再評価を余儀なくされると考えていた。名前と初期値が等しいという完全な実装で可能なので、この再評価を強制する方法を好むだろう。そして、そのような場合には私は初期値をリセットしたい。だから、私は基本的にはすべての既存のパラメータブロック(配列を[]に設定することでそれを行うと考えていました)を作成し、以前に設定した値を考慮しない新しい値を作成します。それは可能ですか? – Niels

+0

あなたは '_parameterData'配列を観察する必要があります。何らかの変更が発生した場合は、そのメソッドを呼び出して、そこにあなたのものを行います。 – Ofisora

+0

それは今働いています。ご協力いただきありがとうございます!たとえ私が要素をリセットするために何らかの方法を選んでいたとしても。 – Niels

関連する問題