[英]Using setters functions in knockoutjs bindings
这已经是一天的尽头了,我的大脑整夜不眠,但是我正在研究如何动态绑定到HTML元素时如何使用setter。 到目前为止,在我读过的许多示例中,以下Urls似乎对使用带有剔除js绑定的setter的主题最有帮助,但是我仍然不了解这个主意,或者还不知道应该怎么做。
例如,下面的我的viewmodel(请参阅fiddle )想保护私有变量,可能稍后会通过添加某种验证代码来实现,但是现在,它只需要获取输入到文本中的参数或文本值即可用户包装。 此类操作的最佳语法到底是什么?
<!-- related bindings: valueUpdate is a parameter for value -->
Your value: <input data-bind="value: someValue, valueUpdate: 'afterkeydown'"/>
如果您尝试通过验证来实现双向绑定,则剔除计算函数应该是最好的方法。 在您的视图模型中,有一个私有变量,并公开了用于绑定的ko.computed函数,然后可以在计算的任一读/写部分中进行验证。
从技术上讲,您可以做到这一点,但这不是使用淘汰赛的方式。 例如,假设我们的视图模型具有一个<select>
和一个文本<input>
绑定。 使用私有变量来保存实际值,意味着我们需要一个可写的computed
观察值来更新它,因为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'];
}
关键是您不需要“保护”您本来可以访问的模型属性,因为如果它们未绑定到视图,则将无法对其进行修改。 此外,如果您现在想使用ko.toJSON
函数轻松地将数据序列化为JSON(除非您愿意重写整个解析函数),则在使用var
会遇到麻烦。 比较两个视图模型的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"]
}
查看小提琴
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.