2017-02-09 14 views
74

Я пытаюсь понять, как правильно следить за некоторыми вариантами поддержки. У меня есть родительский компонент (файлы .vue), которые принимают данные из вызова ajax, помещают данные внутри объекта и используют его для рендеринга некоторого дочернего компонента через директиву v-for, ниже упрощения моей реализации:Vue.js - Как правильно следить за вложенными свойствами

<template> 
    <div> 
     <player v-for="(item, key, index) in players" 
      :item="item" 
      :index="index" 
      :key="key""> 
     </player> 
    </div> 
</template> 

... затем в "сценарий" тег:

data(){ 
    return { 
     players: {} 
}, 
created(){ 
     let self = this; 
     this.$http.get('../serv/config/player.php').then((response) => { 
      let pls = response.body; 
      for (let p in pls) { 
       self.$set(self.players, p, pls[p]); 
      } 
    }); 
} 

вещь объекты, как это:

item:{ 
    prop: value, 
    someOtherProp: { 
     nestedProp: nestedValue, 
     myArray: [{type: "a", num: 1},{type: "b" num: 6} ...] 
    }, 
} 

Теперь внутри моего ребенка "игрок" compone нт я пытаюсь наблюдать за изменением какого-либо предмета собственности, и я использую:

... 
watch:{ 
    'item.someOtherProp'(newVal){ 
     //to work with changes in "myArray" 
    }, 
    'item.prop'(newVal){ 
     //to work with changes in prop 
    } 
} 

Это работает, но это, кажется, немного сложнее для меня, и мне было интересно, если это правильный способ сделать это. Моя цель состоит в том, чтобы выполнить какое-то действие каждый раз, когда «подпирать» изменение или туАггау получает новые элементы или некоторые вариации внутри существующих Любое предложения будет appriciated

+0

Просто используйте ' "item.someOtherProp": функция (newVal, oldVal) {', как предложено @Ron. – Reiner

+1

@ Reiner это именно то, чего он пытался избежать в вопросе; это то же самое, что и синтаксис ES5. На самом деле нет никаких дополнительных накладных расходов при просмотре вычисленного и полезной техники в различных ситуациях. –

ответ

106

Вы можете использовать deep watcher для этого:

watch{ 
    item: { 
    handler(val){ 
     // do stuff 
    }, 
    deep: true 
    } 
} 

Этих теперь обнаружит любые изменения объектов в массиве item и дополнения к самому массиву (при использовании с Vue.set). Вот JSFiddle: http://jsfiddle.net/je2rw3rs/

EDIT

Если вы не хотите, чтобы следить за каждое изменение на объекте верхнего уровня, и просто хотите менее неуклюжий синтаксис для просмотра вложенных объектов напрямую, вы можете просто смотреть computed вместо:

var vm = new Vue({ 
    el: '#app', 
    computed: { 
    foo() { 
     return this.item.foo; 
    } 
    }, 
    watch: { 
    foo() { 
     console.log('Foo Changed!'); 
    } 
    }, 
    data: { 
    item: { 
     foo: 'foo' 
    } 
    } 
}) 

Вот JSFiddle: http://jsfiddle.net/oa07r5fw/

+1

таким образом «обработчик» будет вызываться всякий раз, когда у какой-либо опоры есть вариация, моя цель - отделить обработчики, чтобы наблюдать, происходят ли изменения в «prop» или внутри myArray в «someOtherProp» отдельно – Plastic

+4

Если вы просто хотите посмотреть для изменений на определенных вложенных объектах то, что вы делаете, прекрасно. Если вам нужен менее сложный синтаксис, вы можете посмотреть 'computed' вместо: http://jsfiddle.net/c52nda7x/ –

+0

Точно то, что я искал, теперь мне кажется таким логичным: создайте вычисленное свойство, которое возвращает вложенный и следить за ним. Tnx много. – Plastic

63

еще один хороший подход и один, который немного больше элегантный выглядит следующим образом:

watch:{ 
    'item.someOtherProp': function (newVal, oldVal){ 
     //to work with changes in someOtherProp 
    }, 
    'item.prop': function(newVal, oldVal){ 
     //to work with changes in prop 
    } 
} 

(я узнал этот подход от @peerbolte в comment here)

+3

путь более элегантный (не просто бит): P. Это должно быть в документации Vue.js, так как это обычный вариант использования. Спасибо за ваш ответ. – Symba

+2

@symba Интересно, что люди не заметили, что это то же самое, о чем попросил OP избежать, просто в синтаксисе 'ES5'. Разумеется, мы могли бы утверждать, что определение '' ES2015 method'' (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions) не очень изящно, но оно вроде пропущен вопрос о том, как избежать обертывания имени - это кавычки. Я предполагаю, что большинство людей замалчивают первоначальный вопрос, который уже содержит ответ, и на самом деле ищут что-то, что, как вы говорите, не очень хорошо документировано, –

+0

@craig_h супер интересный момент. Я изначально охотился за часами, чтобы найти хороший способ наблюдать за гнездом. И этот вопрос был самым близким вопросом, который я нашел, но я пропустил, что он перечислил процитированную опору в теле вопроса, но нашел ответы не столь изящными. Наконец, я нашел цитируемый подход prop в комментарии к другому вопросу и был соблазн создать вопрос, чтобы просто ответить на него как документацию цитируемого подхода prop на SO. Но этот вопрос был именно таким, каким был мой титул, поэтому я добавил здесь ответ. Возможно, я должен был создать новый вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^