2016-11-02 2 views
2

Я смотрю Vue.js с целью упрощения приложения, которое начинает слишком сложно с jQuery. Я хочу использовать привязку данных так, чтобы состояние объекта «Заказ» автоматически включало или отключает определенные кнопки (например, я хочу, чтобы кнопка отправки автоматически отключилась, если не существует порядка, содержащего элементы). У меня есть кое-что частично работает, с этой декларацией:Отключение/включение кнопок по данным в Vue.js?

var content = new Vue({ 
    el: '#content', 
    computed: { 
     orderExists: function() { 
      return (shopOrder != null && !isEmpty(shopOrder.items)); 
     } 
    } 
}); 

я использую его в кнопку, как это:

<button type="button" id="btnDisplay" v-bind:disabled="!orderExists">Show Selected</button> 

На странице загрузки, кнопки, используя этот метод действительно включено/отключено правильно. Однако, когда я добавляю элементы к объекту заказа, тем самым изменяя его состояние, я не вижу никакого обновления в состояниях кнопок - они должны быть включены.

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

+0

Знаете ли вы, что если вы принимаете ответ, получаете баллы? –

ответ

1

Хммм, почему бы не передать собственность как реактивные данные?

Вы можете сделать что-то вроде:

... 
computed: { 
     orderExists: function() { 
      this.disabled = (shopOrder != null && !isEmpty(shopOrder.items)); 
     } 
    } 

Fiddle.

DP: пример находится в Vue 2

+0

Это не сработает, потому что если 'shopOrder' - это обычный JavaScript-объект, который не был сделан реактивным Vue,' orderExists' никогда не будет срабатывать, когда он изменится, а 'disabled' никогда не будет обновляться. Для получения дополнительной информации см. Https://vuejs.org/guide/computed.html и прочитайте раздел «Вычисленное кэширование и методы». Кроме того, нет смысла вычислять этот подход, потому что значение всегда будет неопределенным, поскольку оно не возвращает значение. –

2

Вопрос заключается в том, что Vue должен управлять объектами данных для того, чтобы установить их таким образом, чтобы он мог наблюдать изменения в них (т. е. быть реактивными). Это делается путем указания опции data для вашего Vue. Что-то вроде:

data: { 
    shopOrder: null 
} 

Затем обновите ваш код следующим образом:

orderExists: function() { 
    return (this.shopOrder != null && !isEmpty(this.shopOrder.items)); 
} 

И, конечно, в какой-то момент вам нужно установить this.shopOrder на действительный объект заказа.

+0

Я проснулся в ночи с этим самым ответом! Я понял, что я пренебрег этим, чтобы управлять ими. В прошлом году я немного работал с React.js, и там тоже самое, поэтому я должен был подумать об этом. Теперь мне просто нужно прочитать об управлении данными. –

+0

Все еще борется с этим, на самом деле. Я думаю, что моя проблема может быть связана с тем, как я обновляю свойство shopOrder, возможно, испортил проксирование. Если я буду назначать новый объект shopOrder, а не обновлять его свойства, должно ли это работать? То есть, если я делаю что-то вроде «content.shopOrder = newOrder»? В противном случае допустимо ли добавлять новые свойства к существующему управляемому объекту данных? –

+0

Это может помочь увидеть какой-то код в скрипке. Вы должны убедиться, что объект содержится внутри самого Vue, используя опцию 'data', а затем ссылаясь на нее с помощью' this' в контексте методов. –

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