2017-11-16 5 views
1

Vue.js 2.0アプリケーションのオブジェクトの配列に動的にバインドしています。私はその配列変更の値としての変更に対応したいと思います。このとき、このFiddleに示したように、私は次のようしている:私はバインドする方法を見つけるように見えることはできませんジャバスクリプトVue.js - ネストされたプロパティ値の変更を検出する

new Vue({ 
    el: '#app', 
    data: { 
    cols: [ 
     { title: 'Name', prop:'name' }, 
     { title: 'Age', prop:'age' }, 
     { title: 'Birthday', prop:'birthday' },  
    ], 

    inputValues: [], 

    items: [ 
     { id:1, name:'Andreas Winchell', age:47, birthday:'08-04-1970' }, 
     { id:2, name:'Victoria Hodges', age:80, birthday:'01-24-1937' },  
     { id:2, name:'James Morris', age:59, birthday:'06-14-1958' },  
     { id:2, name:'Larry Walker', age:68, birthday:'08-07-1949' },  
     { id:2, name:'Lee Maynard', age:46, birthday:'04-17-1971' } 
    ] 
    }, 

    methods: { 
    buttonClick: function() { 
     alert(JSON.stringify(this.inputValues)); 
    } 
    } 
}) 

HTML

<div id="app"> 
    <table> 
    <thead> 
     <tr> 
     <th v-for="(col, index) in cols"> 
      <input :placeholder="col.title" v-model="inputValues[col.prop]" /> 
     </th>   
     </tr> 
    </thead> 

    <tbody> 
     <tr v-for="(item, index) in items"> 
     <td>{{ item.name }}</td> 
     <td>{{ item.age }}</td> 
     <td>{{ item.birthday }}</td> 
     </tr> 
    </tbody> 
    </table> 

    <hr /> 
    <textarea>{{ inputValues }}</textarea> 
</div> 

ヘッダーに入力された値のいずれかの変更。配列のプロパティ値の変更を検出して対応するにはどうすればよいですか?

+0

ヘッダーにテキストを入力するとどうなると思いますか?私は、実際には 'inputValues'の配列ではなくオブジェクトであることを期待しています。 https://jsfiddle.net/odcxypx6/4/ – Bert

+0

@Bert - 基本的には、メソッドを実行して、変更に応じてロジックに値を適用できるようにします。フィルタのようなもの。 –

+0

https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats –

答えて

1

inputValuesは配列ではなくオブジェクトである必要があります。

data: { 
    cols: [ 
    { title: 'Name', prop:'name' }, 
    { title: 'Age', prop:'age' }, 
    { title: 'Birthday', prop:'birthday' },  
    ], 
    // inputValues should be an object.  
    inputValues: {name: null, age: null, birthday: null }, 

    items: [ 
    { id:1, name:'Andreas Winchell', age:47, birthday:'08-04-1970' }, 
    { id:2, name:'Victoria Hodges', age:80, birthday:'01-24-1937' },  
    { id:2, name:'James Morris', age:59, birthday:'06-14-1958' },  
    { id:2, name:'Larry Walker', age:68, birthday:'08-07-1949' },  
    { id:2, name:'Lee Maynard', age:46, birthday:'04-17-1971' } 
    ] 
} 
+0

オブジェクトであっても、オブジェクトのプロパティ値の変更にどのように反応しますか。たとえば、 'name'プロパティが変更されたとしましょう。更新されたときにメソッドを実行するにはどうすればいいですか? –

+0

@ZachTempletonそれは依存します。一つの方法は、その価値観を見ることです。それが変わったときに何をしたいですか? – Bert

+0

@ZachTempleton質問自体にあなたのコメントを見ました。入力の情報に基づいてテーブルの結果をフィルタリングしますか? – Bert

0

あなたのデータで配列を使用していますが、Vue will not detect direct changes to the array referencing an item by its indexことができます。 Vueはpush()、pop()、slice()などの変更を検出します。

「Cols」のような配列は災害です。 '名前'、 '年齢'、 '誕生日'はデータではなくコード(プロパティ名)です。あなたは本当にこのようなフォームを生成する配列を反復処理したくないです。シンプルにして、3つの入力をコーディングしてください。

+0

ここで配列の 'col.prop'値を使ってv-modelがどのように動作すると思いますか? – Bert

+0

私はv-modelがそのような配列に対して動作するとは思っていません。 v-モデルでは角括弧を使用することはできず、変更が有効であると考えます。しかし、データが配列(つまり、匿名のアイテムx)であれば、オブジェクトに変換するように指示することはできません。 – bbsimonbb

+0

v-モデルでインデクサーを使用することができます。私のコメントにリンクされている変更されたフィドルが表示されます(例:彼が達成しようとしていることがわかったら、v-onとpush()およびsliceそれ。値が完成すると、OPは 'inputValues' *オブジェクト*を' items'にプッシュして(途中で 'id'を追加して)' inputValues'オブジェクトをクリアしたいと考えていますが、OPはちょうどそうです彼の拘束力が今のところ問題になっている。 – Bert

関連する問題