Vue JS - Reactivity $ set свойство в массиве объектов

1

Версия Vue.js v1.0.28. Мне было интересно, как я могу использовать Vue.$set чтобы установить глубокое свойство массива объектов. Например, у меня есть:

this.pairs = [
    {
        "left_media": {
            "name": "A",
            "show": false
        },
        "right_media": {
            "name": "B",
            "show": false
        }
    },
    {
        "left_media": {
            "name": "B",
            "show": false
        },
        "right_media": {
            "name": "A",
            "show": false
        }
    }
]

Мне нужно пройти через массив this.pairs и обновить свойство show каждого name == A медиа name == A до true.

Я могу легко обновить их с помощью цикла for, но представление не изменится. Я провел некоторое исследование и, похоже, Vue.$set может помочь исправить это, но я не могу заставить его работать в этом случае.

Как использовать $set для выполнения: this.pairs[i].left_media.show = false; ?

РЕДАКТИРОВАТЬ

AJAX призывает обновить show_comment

toggleComment: function(media, which_media) {
  this.$http.post('/api/project-media/update.json', {
    id: media.id,
    show_comment: !media.show_comment
  })
  .then(function (response) {
    if (response.body.success) {
      // update show_comment status for this media in all pairs\
      for (let pair of this.pairs) {
        for (let key of Object.keys(pair)) {
          if (key == 'project_media_left' || key == 'project_media_right') {
            if (pair[key].id == media.id) {
              this.$set(pair[key], 'show_comment', !media.show_comment);
            }
          }
        }
      }
    }
  }, function (response) {
  });
}
Теги:
vue.js

1 ответ

1

Если ваша целевая среда поддерживает Object.values или вы используете babel или что-то для компиляции, тогда ее просто

for (let pair of this.pairs)
  for (let v of Object.values(pair))
    if ('A' == v.name) v.show = true

Если нет, тогда

for (let pair of this.pairs)
  for (let key of Object.keys(pair))
    if (pair[key].name == 'A')
      this.$set(pair[key], 'show', true)

Пример.

Но, честно говоря,

for (let pair of this.pairs)
  for (let key of Object.keys(pair))
    if (pair[key].name == prop)
      pair[key].show = true

также работает для меня, поэтому я задаюсь вопросом, есть ли что-то еще в вашей проблеме.

  • 0
    Я попробовал ваши решения. Пара проблем: метод, использующий $ set, сообщает об ошибке Uncaught (in promise) TypeError: t.trim is not a function(…) . Возможно это не установка правильной собственности? Другие методы успешно меняют значение мультимедиа, но это изменение не отображается в браузере.
  • 0
    @nogias Можете ли вы опубликовать код, где вы делаете обновление? Похоже, это в обратном вызове Ajax.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню