2015-12-15 15 views
16
ready: function() { 
    this.$watch('things', function(){console.log('a thing changed')}, true); 
} 

things jest tablicą obiektów [{foo:1}, {foo:2}]

$watch wykrywa, gdy obiekt jest dodawane lub usuwane, ale nie wtedy, gdy wartości na obiekcie są zmieniane. Jak mogę to zrobić?

Odpowiedz

32

Należy przekazać obiekt zamiast boolean jako options tak:

ready: function() { 
    this.$watch('things', function() { 
    console.log('a thing changed') 
    }, {deep:true}) 
} 

Albo można ustawić obserwatora na przykład vue jak ten:

new Vue({ 
    ... 
    watch: { 
    things: { 
     handler: function (val, oldVal) { 
     console.log('a thing changed') 
     }, 
     deep: true 
    } 
    }, 
    ... 
}) 

[demo]

+0

Nicea, była to kwestia migracji. W ostatniej wersji vue użyłem 'true', ponieważ ostatni argument oznaczał' deep'. Ty! –

+0

Pracowałem dla mnie. Dzięki! – Lorenzo

+0

"Gotowy" zmienił nazwę na "zamontowany" w wersji 2.0! – user1506145

1

Jeśli ktoś musi dostać przedmiot, który został zmieniony w tablicy, sprawdź go:

JSFiddle Example

Post przykładowy kod:

new Vue({ 
    ... 
    watch: { 
    things: { 
     handler: function (val, oldVal) { 
     var vm = this; 
     val.filter(function(p, idx) { 
      return Object.keys(p).some(function(prop) { 
       var diff = p[prop] !== vm.clonethings[idx][prop]; 
       if(diff) { 
        p.changed = true;       
       } 
      }) 
     }); 
     }, 
     deep: true 
    } 
    }, 
    ... 
})