2017-11-16 1 views
1

Ich bin dynamisch an ein Array von Objekten in einer Vue.js 2.0 App gebunden. Ich möchte auf Änderungen als Werte in diesem Array reagieren. Zu diesem Zeitpunkt, wie in diesem Fiddle gezeigt, habe ich folgendes:Vue.js - Erkennen geschachtelter Eigenschaftswertänderungen

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> 

Javascript

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)); 
    } 
    } 
}) 

Ich kann nicht scheinen, einen Weg zu finden, zu binden, Änderungen an den in die Kopfzeile eingegebenen Werten. Wie kann ich Änderungen an Eigenschaftswerten in einem Array erkennen und darauf reagieren?

+0

Was erwarten Sie, wenn Sie Text in die Kopfzeile eingeben? Ich erwarte, dass Sie kein Array für 'inputValues' wollen, sondern ein Objekt. https://jsfiddle.net/odcxypx6/4/ – Bert

+0

@Bert - Grundsätzlich möchte ich eine Methode ausführen, so dass ich einige Logik auf den Wert anwenden kann, wie es sich ändert. Irgendwie wie ein Filter. –

+0

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

Antwort

1

inputValues sollte ein Objekt sein, kein Array.

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

Auch wenn ts ein Objekt ist, wie reagiere ich auf Änderungen der Eigenschaftswerte im Objekt. Nehmen wir zum Beispiel an, dass sich die Eigenschaft 'name' ändert, wie kann ich eine Methode ausführen, wenn diese aktualisiert wird? –

+0

@ZachTempleton Kommt drauf an. Ein Weg wäre, diesen Wert zu beobachten. Was möchten Sie tun, wenn es sich ändert? – Bert

+0

@ZachTempleton Ich habe gerade Ihren Kommentar zur Frage selbst gesehen. Möchten Sie die Tabellenergebnisse basierend auf Informationen in den Eingaben filtern? – Bert

0

Sie Arrays in Ihren Daten verwenden können, aber Vue will not detect direct changes to the array referencing an item by its index. Vue erkennt Änderungen, die mit push(), pop(), slice() usw. vorgenommen wurden.

Arrays wie 'Cols' sind eine Katastrophe. "Name", "Alter" und "Geburtstag" sind Code (Eigenschaftsnamen), keine Daten. Sie wollen wirklich nicht über ein Array iterieren, das solche Formen erzeugt. Halten Sie es einfach und codieren Sie Ihre drei Eingaben.

+0

Wie genau erwarten Sie, dass v-model hier mit den 'col.prop' Werten in einem Array arbeitet? – Bert

+0

Ich erwarte nicht, dass v-model gegen ein solches Array arbeitet. Sie können im v-Modell keine eckigen Klammern verwenden und erwarten, dass die Änderungen reaktiv sind. Aber wenn die Daten ein Array sind (dh x anonyme Elemente), können wir ihm nicht einfach sagen, dass er es in ein Objekt verwandeln soll. Irgendeine Kombination von v-on mit push() und slice() wird es tun, sobald wir wissen, was er erreichen will :-) – bbsimonbb

+0

Sie * können * indexers in v-model verwenden, und die in meinem Kommentar verlinkte modifizierte Geige zeigt es. Ich erwarte, dass OP, sobald die Werte vervollständigt sind, das 'inputValues' * Objekt * in' items' (Hinzufügen einer 'id' auf dem Weg) und dann das' inputValues' Objekt verschieben will, aber OP scheint einfach zu sein ein Problem bekommen, seine Bindung für jetzt zu arbeiten. – Bert

Verwandte Themen