在knockoutjs绑定中使用setters函数
Using setters functions in knockoutjs bindings
这是一天的结束,我的大脑整夜都在思考,但我正在学习如何在动态绑定到Html元素时使用setter。到目前为止,在我读到的许多例子中,下面的Url似乎对使用具有knockoutjs绑定的setter主题最有帮助,但我仍然不知道该如何做到这一点。
- knockoutjs数据绑定设置器
- 条件绑定函数
- 动态生成元素上的敲除数据绑定
- javascript中简单的双向数据绑定
例如,我下面的视图模型(请参阅fiddle)希望保护私有变量,稍后可能会添加某种验证代码。然而,现在,它只需要获取用户在文本框中输入的参数或文本值。这种操作的最佳语法究竟是什么?
<!-- related bindings: valueUpdate is a parameter for value -->
Your value: <input data-bind="value: someValue, valueUpdate: 'afterkeydown'"/>
如果您试图在验证的同时实现双向绑定,那么敲除计算函数应该是最好的方法。在您的视图模型中,有一个私有变量,并为绑定公开ko.computed函数,然后在计算的读/写部分中,您可以进行验证。
从技术上讲,你可以这样做,但这不是Knockout的使用方式。例如,假设我们的视图模型有一个<select>
和一个文本<input>
绑定。使用私有变量来保存实际值意味着我们需要一个可写的computed
observable来更新它,因为Knockout只将属性绑定到视图,而不是私有变量。
function appWithPrivateVars() {
var selectedItem = ko.observable('Option 3'), //our private vars
textVal = ko.observable('Haha');
this.selected = ko.computed({
read: function() { return selectedItem(); },
write: function(value) { /* add validation code here */ selectedItem(value); }
});
this.textVal = ko.computed({
read: function() { return textVal(); },
write: function(value) { /* add validation code here */ textVal(value); }
});
this.listItems = ['Option 1','Option 2','Option 3'];
this.get = function() { return selectedItem(); }; //getter
}
现在,在不关心私有变量的情况下,与同一视图模型所需的代码进行比较(还要注意,您不需要显式的getter/setter):
function appWithProperties() {
var self = this;
this.textVal = ko.observable('Haha');
// example of computed
this.textValInput = ko.computed({
read: function() { return self.textVal(); },
write: function(value) { /* add validation code here */ textVal(value); }
this.selected = ko.observable('Option 3');
this.listItems = ['Option 1','Option 2','Option 3'];
}
问题是,你不需要"保护"你本来可以访问的模型属性,因为如果它们没有绑定到视图,就无法修改。此外,如果您使用var
,那么您将遇到麻烦。此时,您希望使用ko.toJSON
函数轻松地将数据序列化为JSON(除非您愿意重写整个解析函数)。比较两种视图模型的ko.toJSON
输出:
appWithPrivateVars
的样本数据
// no private vars included, eg. 'selectedItem'
{"selected":"Option 1", // computed prop; not what we need
"textVal":"Haha",
"listItems":["Option 1","Option 2","Option 3"]}
查看映射中如何不包括"实际"值(这是合乎逻辑的,因为ko.toJSON
无法访问这些值)。现在查看appWithProperties
:的JSON输出
{"textVal":"Haha", // actual value
"textValInput: "Haha", // value filter
"selected":"Option 1",
"listItems":["Option 1","Option 2","Option 3"]
}
查看小提琴
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 在knockoutjs绑定中使用setters函数