Ext JS MVVM技巧:第1部分。自绑定





5.00/5 (3投票s)
在本技巧中,您将学习如何创建一个具有配置属性的组件,并使用MVVM将其绑定到这些属性。
引言
本技巧是为那些希望从Ext JS中的MVVM中榨取更多价值的高级用户而创建的,对于那些直觉上认为某些事情可以做得更好的人。
在这一部分中,我们将回顾一种自绑定技巧。它是什么?简而言之,它是在自定义组件内的数据绑定。
这与封装原则相关。当您创建自己的具有其配置属性(配置)的组件时,您希望将它们绑定到某些内部组件。例如,将projectName
配置显示在标签中,或者使用locked
标志来影响某些字段的可用性。
让我们探讨一下实现此目的的方法。
背景
这是Sencha的官方MVVM指南:视图模型和绑定。
在这些示例中,Sencha对所有内容都使用一个ViewModel
。并在一个视图中绑定数据。这对于小型项目是可以接受的,但对于大型项目来说,这肯定会成为一个问题。总有一天,您会想到创建独立的、可重用的组件,并同时使用MVVM的优势。
示例
看看这个例子。在这里,我们想创建一个可重用的组件,一个带有用户的网格。'删除'按钮包含所选用户的名称。网格可以使用配置属性锁定以进行更改。我们称之为readOnly
。在此示例中,我们将在组件外部使用“设置只读”按钮来实现。我们还希望绑定到外部容器中的网格选择。
我们的目标
- 使用配置属性来更改组件的状态
- 使用MVVM的优势。没有处理程序,只有数据绑定
- 能够在具有其自己的
ViewModel
或没有ViewModel
的容器中使用网格
问题
如果我们开始,我们将面临框架的一些限制
- 组件无法在其配置属性和内部组件之间进行绑定。
- 如果内部组件具有
ViewModel
(票号#EXTJS-15503),则外部组件无法绑定到组件的发布属性。
它们在我看来很奇怪,所以我决定做一个修复。它被称为Ext.vmx.mixin.Bindable
,它解决了这些问题。
Using the Code
因此,使用此修复程序,我们可以编写我们想要的组件。看看这段代码。
/**
A reusable users grid
*/
Ext.define('Fiddle.view.UsersGrid', {
extend: 'Ext.grid.Panel',
xtype: 'usersgrid',
viewModel: {
},
config: {
readOnly: false
},
publishes: ['readOnly'],
tbar: [{
text: 'Add',
itemId: 'addButton',
bind: {
disabled: '{readOnly}'
}
}, {
text: 'Remove',
itemId: 'removeButton',
bind: {
disabled: '{readOnly}',
text: 'Remove {selection.name}'
}
}],
columns: [{
dataIndex: 'id',
header: 'id'
}, {
dataIndex: 'name',
header: 'name'
}]
});
看起来很优雅,对吧? 这是我们所做的
- 定义一个空的
viewModel
- 定义一个
readOnly
配置 - 在
publishes
部分中将其标记为已发布 - 创建到
readOnly
配置的数据绑定 - 创建到
selection
配置的数据绑定。它也被Ext.grid.Panel
标记为已发布
优点
那么它有什么好处呢? 有一些我个人喜欢的东西
- 该组件现在更加独立。您可以在具有或不具有
ViewModel
的容器中使用它。现在没有区别。 - 您不需要在
ViewModel
中定义任何内容。这会通过publishes
部分自动完成。 - 您可以自由地为您的配置属性创建任何处理程序。一切都由MVVM引擎处理。所以代码变得更小。
我已经将此扩展用于我的项目大约2年了,并且没有任何问题。它是向后兼容的,因此您可以在项目中使用它,而不会破坏任何东西。
不要忘记将'Ext.vmx.mixin.Bindable'
包含在应用程序的requires
部分中。
缺点
使用此方法时,我们需要记住的一件事。“不要将数据对象嵌套得比必要的更深” - 来自Sencha的建议。 否则,我们可能会遇到性能问题。 例如,我不会创建一个递归的评论树,其中每个评论都显示在具有ViewModel
的组件中。 但是我没有遇到3-4级ViewModel
层次结构的性能下降。
来源
好的,如果您喜欢它,请查看Sencha Fiddle上的在线演示
以及GitHub上的源代码
待续
在第二部分中,我们将谈论在Ext JS MVVM方面更强的组件隔离。 目前,您可能仍然会搞乱ViewModel
层次结构,数据名称,它们是否应该唯一,是否应该使用引用以及它们为什么仅在一个方向上起作用等。 因此,在下一部分中,我们将讨论如何在不断增长的项目中使MVVM更具可预测性。
更新
- 修复了缺少的图像