我有一个自定义绑定,ko.bindingHandlers.editBinding
可以做很多神奇的事情。其中一个是readonly参数,它控制是否提供编辑引用的observable的选项。
<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: CurrentOrderSystemStatusID() != 1 }"></div>
只读绑定相对较新,并且可以在会话期间通过外部事件进行更改。因此,当它发生变化时,所有当前正在编辑的小部件都需要丢弃所有更改并关闭并隐藏编辑功能。
我的自定义虚拟机有一个readonly计算,当它在依赖性中传递时不会更新,我无法弄清楚原因。
self.readOnly = ko.computed(function() {
return ko.utils.unwrapObservable(valueAccessor().readonly) || false;
});
同样有趣:
self.toggleFunc = function() {
var isEditing, otherEditingVM, _ref;
//this works
//original coffeescript
//#if valueAccessor()?.readonly and ko.utils.unwrapObservable valueAccessor().readonly is true then return
//if (((_ref = valueAccessor()) != null ? _ref.readonly : void 0) && ko.utils.unwrapObservable(valueAccessor().readonly === true)) {
//this doesn't
if (self.readOnly()) {
return;
}
基础标记
<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: CurrentOrderSystemStatusID() != 1 }"></div>
当我将readonly移动到viewmodel时,它可以工作!为什么呢?是不是还要将内联表达式计算为计算结果呢?
self.ShouldBeReadOnly = ko.computed(function() { return self.CurrentOrderSystemStatusID() === 0;})
<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: ShouldBeReadOnly }"></div>
我把一堆东西拿出来,为你的观赏乐趣做了一个很好的傻瓜 - http://jsfiddle.net/scaryman/QDgde/3/
修改
Knockout就像我想象的那样不起作用。如果我将逻辑移动到viewModel中的计算器中,它可以工作(请参阅更新),如果我使用ko.computed包装内联逻辑,它也可以工作。
<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: ko.computed(function() {return CurrentOrderSystemStatusID() != 1;}) }"></div>
这仍然没有向我解释为什么下面的代码在事件处理程序中起作用
//#if valueAccessor()?.readonly and ko.utils.unwrapObservable valueAccessor().readonly is true then return
if (((_ref = valueAccessor()) != null ? _ref.readonly : void 0) && ko.utils.unwrapObservable(valueAccessor().readonly === true)) {
答案 0 :(得分:1)
你是对的,淘汰赛没有评估计算的内联表达式,所以你必须将像CurrentOrderSystemStatusID()=== 0这样的表达式包装到计算中,例如
readonly: ko.computed(function() { return CurrentOrderSystemStatusID() === 0; })
答案 1 :(得分:1)
我将尝试解释为什么下面的代码工作,而上面的代码没有。
工作
// #if valueAccessor()?readonly和ko.utils.unwrapObservable valueAccessor()。readonly为true然后返回 if(((_ ref = valueAccessor())!= null?_ref.readonly:void 0)&amp;&amp; ko.utils.unwrapObservable(valueAccessor()。readonly === true)){
此处,您的viewmodel可以通过valueAccessor访问值,该值始终提供实际的模型状态。如果您更改'readonly',则访问者会给出新值。
不能正常工作
if(self.readOnly()){
在这里,您可以访问您的viewmodel计算'readOnly'。但是,当您更改'readonly'的值时,此计算的值不会更改。你总是得到第一个价值。因为此计算不具有影响其值的任何计算或可观察量。在您的readOnly计算中放置警报('嘿'),当您更改'readonly'时,您将看到没有通知。