使knockout侦听非击键结果的值更改
Make knockout listen to values changes which are not a result of a keystroke
self.totalHours = ko.pureComputed(function() {
var start=self.num1;
var end=self.num2;
return start+end;
});
<input type="text" data-bind="textInput: start">
<input type="text" data-bind="textInput: end">
<input type="text" data-bind='text: totalHours()'>
上面第一个是我的viewmodel
的一部分,第二个是我的model
的一部分。num1,num2是可观测对象。每次我手动更改前两个输入中的值时,第三个输入立即更新;但是,当值被代码改变时,knockout不会侦听这些变化,total
也不会更新。我怎样才能迫使knockout倾听代码引起的变化呢?
你可以在这里修复和改进很多东西:
- 计算值将在其方法中使用的可观察对象发生变化时重新评估:
self.num1
和/或self.num2
需要被观察和使用()
评估 - 如果你想绑定
<input>
的值,你必须使用value
或textInput
数据绑定;text
绑定将不工作。 - 如果你想写一个计算,你必须指定一个
write
方法。您必须告诉knockout如何更新computed的依赖项,以确保所有值相加。(例如:设置totalHours
可以设置num1
为totalHours
,num2
为0
) - 你绑定了
start
和end
,而你的视图模型属性被命名为num1
和num2
。 - 当使用
value
或textInput
时,用户输入将以字符串形式返回。如果你想在任何数学中使用它们,你需要将字符串解析为数字。
var ViewModel = function() {
var self = this;
self.num1 = ko.observable(0);
self.num2 = ko.observable(0);
self.totalHours = ko.pureComputed(function() {
var start = parseFloat(self.num1());
var end = parseFloat(self.num2());
return start + end;
});
};
var vm = new ViewModel();
ko.applyBindings(vm);
// Updating your values from code:
vm.num1(1);
vm.num2(2);
// Whenever the values need to be updated via js,
// you should change the source values, _not_ the
// <input>'s values. Worst case scenario, you'll
// have to do something like this:
var updateNum1ViaDOM = function() {
ko.dataFor(document.querySelector("input")).num1(5);
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="text" data-bind="textInput: num1">
<input type="text" data-bind="textInput: num2">
<span data-bind='text: totalHours'></span>
注意:使用扩展器强制num1
和num2
为数字可能更好:实际示例1:强制输入为数字
不确定是否是复制粘贴问题,但您发布的代码将无法按预期工作。我已经更新了这个例子,当改变一个可观察对象的值时,它必须作为参数传递,以免覆盖可观察对象
self.start = ko.observable();
self.end = ko.observable();
self.totalHours = ko.computed(function() {
return self.start() + self.end();
});
<input type="text" data-bind="textInput: start">
<input type="text" data-bind="textInput: end">
<input type="text" data-bind='text: totalHours()'>
//Then when changing the value by code
var newValue = 42;
model.start(newValue); //assuming you are making the change outside your viewmodel
*注意到这段代码会在编辑绑定到totalHours的输入时抛出异常,因为它没有定义写处理程序。这是一个单独的问题。
相关文章:
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 将地理编码结果转换为php变量以发布到mysql数据库
- AngularJS/HTML/Bootstrap元素用于动态搜索结果
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- JQuery:向多个匹配结果添加换行符的最简单方法
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- webpack代码拆分了handlerbs文件——结果是文件很大
- JavaScript循环无法正确计算/显示结果
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- 显示模块模式在Knockout中设置模型的新实例
- 如何使用SignalR从服务器传递数组,并使用Knockout显示结果
- Knockout js的可见数据绑定属性不显示结果
- 将javascript变量(从knockout.js)发送到PHP并返回结果
- 使knockout侦听非击键结果的值更改