使挖空计算订阅不在初始执行路径中的可观察量
Make Knockout computeds subscribe to observables not in initial execution path?
我有以下问题:
self.observables.disableDeleteNumberButton = ko.computed(function () {
return !self.observables.isEditableReceivable() || !self.observables.aRNumber();
});
由于初始化计算时不会评估self.observables.aRNumber
,因此计算似乎不会订阅此可观察量的更改。
我可以用这样的东西强制评估:
self.observables.disableDeleteNumberButton = ko.computed(function () {
var editableReceivable = self.observables.isEditableReceivable();
var aRNumber = self.observables.aRNumber();
return !editableReceivable || !aRNumber;
});
但这看起来不太好...
在淘汰赛中做到这一点的正确方法是什么?
你的计算是可以的,它正在做它应该做的事情。问题是这种return !self.observables.isEditableReceivable() || !self.observables.aRNumber();
可能会导致短路评估。
如果!self.observables.isEditableReceivable()
结果为 true,则无需评估!self.observables.aRNumber()
。即使你改变了多少self.observables.aRNumber()
的值,它仍然不会到达这条线!self.observables.aRNumber()
如果这条线仍然!self.observables.isEditableReceivable()
结果为 true。
检查这个小提琴。
单击"切换AR编号"按钮永远不会触发计算,除非您先单击"切换可编辑应收账款"按钮。
====
=================编辑:我真的不知道这种类型的答案是否应该在这里,或者我应该将其作为评论添加到问题中。但我只会等待模组:D
我已经使用过Knockout很多次,但还没有遇到这个问题(令我惊讶的是,因为这是一个相当简单的问题)。
要回答您的问题:AFAIK 您的解决方法的想法是唯一的选择。我只能想到其他语法的变化,或者可能将其分解为实用方法的方法。
如果您确实需要短路,例如为了性能,您可以查看这些文档并利用ko.computedContext.isInitial()
。
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 在Safari执行javascript之前对其进行修改
- Amd,希望确保某个东西总是最后执行
- 节点命令不执行星号路径
- 在网页上执行绝对路径的所有点击前面加上网址
- JavaScript执行路径
- 使挖空计算订阅不在初始执行路径中的可观察量
- 节点.js相对需要执行脚本的路径
- 将变量创建到路径JSON是由jQuery执行的操作
- node.js,bluebird,执行路径控制不力
- d3.js/CoffeeScript:访问mouseover中类和路径的执行上下文(this)
- 为什么在获取脚本路径时使用自执行匿名函数?
- 如何获取当前文件中可执行文件的路径
- 我收到警告“值返回不是所有执行路径”在javascript中的jQuery.grep