2017-10-10 6 views
0

Versucht, vue watch-Methoden zu verwenden, aber es scheint nicht für einige Objekte auch mit deep:true auslösen.Vue Watch nicht triggern

In meiner Komponente erhalte ich ein Array als Prop, das die Felder die folgenden Formen erstellen. kann ich die Formen bauen und dynamicly binden sie an ein Objekt namens crudModelCreate und alles funktioniert (i in vue Entwickler-Tools sehen und sogar die Form submiting arbeitet nach Plan)

Aber ich habe ein Problem, zu versuchen, die Änderungen zu sehen in diesem dynamischen Objekt.

<md-input v-for="(field, rowIndex) in fields" :key="field.id" v-model="crudModelCreate[field.name]" maxlength="250"></md-input> 

    ... 

    data() { 
     return { 
     state: 1, // This gets changed somewhere in the middle and changes fine 
     crudModelCreate: {}, 
     } 
    }, 
    ... 
    watch: { 
     'state': { 
      handler: function(val, oldVal) { 
       this.$emit("changedState", this.state); 
       // this works fine 
      }, 
     }, 
     'crudModelCreate': { 
      handler: function(val, oldVal) { 
       console.log("beep1") 
       this.$emit("updatedCreate", this.crudModelCreate); 
       // This doesn't work 
      }, 
      deep: true, 
      immediate: true 
     }, 
    } 
+0

Wie werden Änderungen in Ihrem Objekt durchgeführt? –

+2

Möglicherweise müssen Sie ['Vue.set'] (https://vuejs.org/v2/api/#Vue-set) verwenden, um Objekteigenschaften zu aktualisieren, insbesondere wenn neue hinzugefügt werden. –

+0

Mögliches Duplikat von [Vue.js beobachtet tiefe Eigenschaften] (https://stackoverflow.com/questions/44760474/vue-js-watching-deep-properties) –

Antwort

0

Aus der Dokumentation

Aufgrund der Einschränkungen des modernen JavaScript (und die Aufgabe von Object.observe) kann Vue Eigenschaft Hinzufügen oder Löschen nicht erkennen. Da Vue den Getter/Setter-Konvertierungsprozess während der Instanzinitialisierung ausführt, muss eine Eigenschaft im Datenobjekt vorhanden sein, damit Vue es konvertieren und reaktiv machen kann.

Bitte werfen Sie einen Blick auf Reaktivität in Tiefen https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats

+0

Sogar die Uhr das Hinzufügen von etwas mit Größen wie 'dieser $ Uhr (‚$ data.crudModelCreate‘, this.updated, {tief: true}) tun nicht ganz Arbeit initialisiert' nach den Werten wurden.. Und nachdem ich getan habe, was Andrei Nemes gesagt hat, hat es funktioniert, und ich denke, in meinem Anwendungsfall war das nicht so sehr eine Einschränkung. –

+0

Eigentlich, was die Dokumentation sagt, es ist genau das Problem, das Sie hatten, wenn Sie ein Objekt auf Daten wie 'crudModelCreate: {}' definieren und später fügen Sie Eigenschaften wie in der Uhr 'crudModelCreate' hinzu, die diese neuen Requisiten nicht sind reaktiv, es sei denn, Sie weisen es als 'Vue.set (Objekt, Schlüssel, Wert) 'zu, wie @Andrei Nemes es korrekt erwähnt hat und auf das ich von den Dokumenten aus zeige – ricardoorellana