[英]How can i change value of observable inside of subscribe function?
如何更改subscribe函数内的observable值? 例如
JS型号:
function Model(){
self = this;
self.Test = ko.observable(2);
self.Test.subscribe(function (){
if (/**Some bool expression**/) {
self.Test(2);
}
});
}
HTML:
<input type="radio" value="1" data-bind="checked:Test" />
<input type="radio" value="2" data-bind="checked:Test" />
<input type="radio" value="3" data-bind="checked:Test" />
默认情况下,检查第二个无线电输入 点击第一个收音机后,第一个和第二个都被选中。
更新:当我同时包含jQuery和knockout时会发生这种情况。 如果删除jquery,那么一切都好。 但它只是测试页面。 在实际项目中,我需要在某些地方使用jQuery,在这种情况下我无法删除它。
样品 。 测试页面来源:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="knockout-2.1.0.js"></script>
<script type="text/javascript" src="jquery-1.6.4.js"></script>
<script type="text/javascript">
function Model(){
self = this;
self.Test = ko.observable(2);
self.Test.subscribe(function (){
if (true) {
self.Test(2);
}
});
}
</script>
</head>
<body>
<input type="radio" value="1" data-bind="checked:Test" />
<input type="radio" value="2" data-bind="checked:Test" />
<input type="radio" value="3" data-bind="checked:Test" />
</body>
<script type='text/javascript'>
ko.applyBindings(new Model());
</script>
</html>
更新(2015-02-27):从Knockout 3.1.0开始,Knockout不包含click
事件的任何“变通方法”代码,并且在处理问题中的示例时应该没有问题。 http://jsfiddle.net/9S96U/3/
当包含jQuery时,Knockout使用它来处理事件,包括用于响应单选按钮的click
事件。 它包含一些“解决方法”代码,以确保单击处理程序看到单选按钮的正确选中状态,但这似乎会干扰尝试重置中间检查值的代码。
解决方案是使用setTimeout更新值。 这种方式在点击处理程序完成后发生。
function Model(){
var self = this;
self.Test = ko.observable(2);
self.Test.subscribe(function (){
setTimeout(function() {
self.Test(2);
});
});
}
示例: http : //jsfiddle.net/9S96U/1/
你还需要在self = this
之前包含var
,这样你就不会覆盖window.self
。
订阅/发布背后的想法是,您可以让一个观察者将结果发送给多个订阅者,他们自己进行测试。
我还没有真正使用过knock.js,但是我已经完成了很多委托/异步流/ promises /等工作 - 主要是使用特殊情况的轻量级自定义实现。
你的目标是拥有一个运行测试一次的控制器(你现在得到的),然后遍历每一个,确保选中正确的一个( i - 1
),并且所有其他的都未经检查...
...或者以更传统的发布者/订阅者方式,让一个发布者(如可能是所有无线电控件的父元素的fieldset
)监听其中一个要更改的输入,然后通知EACH订阅值的输入,并让他们自己进行测试。
在伪说话:
var subscribers = []; // array of input "Model" callbacks
// (ie: tests to determine whether they're off or on)
parentElement.listen("click", function (e) {
var self = this,
selectedRadio = e.target,
val = selectedRadio.value;
subscribers.forEach(function (notify) { notify(val); });
});
要处理当前情况,可以使用依赖注入:
new Model( value );
要么
new Model( subscription_test_for_element );
您可以在哪里缓存预期的测试值,或者在每个单独实例中缓存特定于输入的测试/成功/失败逻辑的位置......
...或者您创建一个更大的控制器(不推荐)来处理每个输入的硬编码逻辑。
当然,更具体的帮助,可以根据被给予你的模型是 什么 ,你是如何实例化,为什么你硬编码您的订阅进入施工,如果它要成为一个通用模型,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.