Похоже, что у меня есть недоразумение со временем привязки. У меня есть простой combobox со значением, привязанным к некоторому объекту в viewmodel. Выбор нового значения, событие смены огня, которое запускается после метода setValue, поэтому мое новое значение уже установлено, но моя модель просмотра еще не обновлена. Когда моя модель просмотра будет обновлена? Я нашел некоторую информацию о планировщике, в которой говорится, что мне нужно запустить метод notify(), чтобы немедленно применить изменения к viewmodel, но мне это совсем не помогает.ExtJS 5.1.1 Немедленное связывание с огнем в ViewModel
Ext.define('MyModel', {
extend: 'Ext.data.Model',
idProperty: 'foo',
fields: [{
name: 'bar',
type: 'string'
}]
});
Ext.define('MyViewModel',{
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.my',
data: {
testObj: {
foo: null,
bar: null
}
},
stores:{
combostore: {
model: 'MyModel',
data: [{
foo: '1',
bar: 'qwerty'
},{
foo: '2',
bar: 'ytrewq'
}]
}
}
});
Ext.define('MyViewController', {
extend: 'Ext.app.ViewController',
alias: 'controller.my',
onChange: function() {
var vm = this.getViewModel();
vm.notify();
console.log(vm.get('testObj.foo'));//supposed to be current value
}
});
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.create('Ext.container.Viewport', {
controller: 'my',
viewModel: {
type: 'my'
},
layout : 'vbox',
items : [
{
xtype : 'combo',
valueField: 'foo',
displayField: 'bar',
queryMode: 'local',
bind: {
store: '{combostore}',
value: '{testObj.foo}'
},
listeners:{
change: 'onChange'
}
}
]
});
}
});
Вот скрипку как хорошо: https://fiddle.sencha.com/#fiddle/r88
Я верю, что 'vm.notify()' не будет выполнять свою работу синхронно. Обратите внимание, что добавление опции 'delay: 1' в конфигурацию слушателей делает трюк, даже' vm.notify() 'становится излишним. – Greendrake
Если вам нужно использовать 'delay: 1', он должен вызывать все звонки, которые вы делаете неправильно. То же самое для вызова 'notify()' таким образом. – Tarabass
1. По умолчанию в хранилище есть своя конфигурация 'autoSync' для false. Возможно, вам нужно установить его в true для comboStore в вашем представленииModel? | 2. Не следует проверять хранилище в событии onChange вашего комбо, потому что комбо не успевает синхронизировать ваш магазин ... | Замечание: в extjs вы не изменяете значение combo, а содержимое магазина, поэтому, если вы хотите проверить любые изменения в своем комбо, проверьте его в своем магазине – Michel