定义视图类,用Ext.define('xxx',{}),
定义视图类的成员变量,用config:{xxx:123},
定义视图类和vm中的绑定关系,用bind:{xxx:'{yyy}'},yyy指向vm中的data属性的yyy变量
双向绑定视图类和vm中的变量,用publishes:‘xxx’,将xxx和yyy作双向绑定
双向绑定后,需要注意,变量的传递方向是:视图到vm是自动更新的,但是vm到视图的不会自动更新,需要手工vm.notify()
可以理解为数据按从上到下(视图->vm)的方向传递是自动的,但从下往上(vm>视图-)的传递,需要手工触发
例子:
Ext.define('MyApp.viewModel.Test',{
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.test',
data:{serverPathDat>:''}
});
Ext.define('MyApp.view.TestField',{
extend: 'Ext.form.field.Text',
xtype:'TestField',
viewModel:{type:'test'},
config:{serverPath:null},
publishes:'serverPath',
bind:{
serverPath:'{serverPathData}',
fieldLabel:'label :{serverPathData}',
lazy:false
}
});
Ext.application({
name: 'MyApp',
launch: function() {
//Ext.Msg.alert('Fiddle', 'Welcome to Sencha Fiddle!');
var textField = Ext.widget({xtype:'TestField',renderTo:Ext.getBody()});
var vm = textField.getViewModel();
console.log(textField.getFieldLabel());
console.log("1vm",vm.get("serverPathData"));
vm.set('serverPathData', '123');
vm.notify();//vm到视图的更新,需要手动notify,去掉这句就会导致console中的 <span style="font-family: Arial, Helvetica, sans-serif;">2c null</span>
console.log("2vm",vm.get("serverPathData"));
console.log("2c",textField.getServerPath());
textField.setServerPath("456");//vm到视图会自动更新
console.log("3vm",vm.get("serverPathData"));
console.log("3c",textField.getServerPath());
setTimeout(function(){console.log(textField.getFieldLabel());});
}
});
>>
1vm
2vm 123
2c 123 //如果没有vm.notify()则是 2c null
3vm 456
3c 456
label :123