本帖最后由 棕榈 于 2020-3-29 16:19 编辑
FineUI + Knockout 实现数据绑定
knockout 是 MVVM模式的JS实现,文档 https://knockoutjs.com/documentation/introduction.html
由于 knockout 数据绑定是在DOM上的,而 FineUI 的控件都是通过JS创建的,并且控件都有自己的DOM结构,无法直接使用 knockout 进行数据绑定,这里可通过创建自定义数据绑定来实现。
我已对 FineUI 控件的常用方法及事件进行了数据绑定的封装,如下面就是控件的数据绑定定义:
- <f:TextBox Label="姓" AttributeDataTag="f:{text:surname}"></f:TextBox>
- <f:TextBox Label="名" AttributeDataTag="f:{text:name}"></f:TextBox>
- <f:Label Label="姓名" Text="<span data-bind='text:fullname'></span>" EncodeText="false"></f:Label>
复制代码
这是 ViewModel 代码:
- function ViewModel() {
- var self = this;
- self.surname = ko.observable('李');
- self.name = ko.observable('某某');
- self.fullname = ko.pureComputed(function () {
- return self.surname() + self.name();
- });
- };
复制代码
f 为数据绑定的名称,可以通过 f:{text:name} ,将 name 绑定到 text 属性上,这里的 text 属性对应 FineUI 控件中 setText 方法,当然也可以写成 f:{setText:name},但这样不够简单直观,所以这里做了一些封装,首先会检测当前属性在 FineUI 控件中是否有对应的方法,如果有则直接采用,如果没有,加上set后再次检测是否含有,这样就可以直接使用 text 而不必使用 setText,相关的方法有很多,如:
- setDisabled
- setEditable
- setEmptyText
- setEnabled
- setFieldLabel
- setHeight
- setHidden
- setMaxLength
- setMinLength
- setReadonly
- setRedStar
- setRegex
- setRegexPattern
- setRequired
- setSize
- setText
- setTooltip
- setValue
- setVisible
- setWidth
复制代码
都可以直接将 set 去掉,直接使用后面的名称,如 tooltip 等,这里要注意,对于方法需要传递两个参数的,只能传递第一个参数,对于多个参数只能通过FineUI提供的api进行调用。
事件直接使用FineUI控件提供的事件名称,如 click , 可以直接写 f:{click:save},save为ViewModel中的方法,这里还要注意一下,由于FineUI控件中的方法名与事件名有相同的,如click,hide,show,这里都将示为事件名。
下面为示例中的代码:
关于示例代码,这里简单说一下,由于 FineUI 中没有直接提供 data-bind 的属性,这里借用了 AttributeDataTag 属性,并在 FineUI 控件初始化完成后,将 data-tag 中的值复制到 data-bind 中,代码:
- $('[data-tag]').each(function () {
- $(this).attr('data-bind', $(this).data('tag'));
- });
复制代码
希望三石兄提供一个 AttributeDataBind 属性,这样就可以直接使用,而不必借用 AttributeDataTag 属性。
示例项目文件及 knockout-fineui.js 请到知识星球下载。
|