数据绑定括号在Knockout.js中是如何工作的

n6lpvg4x  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(168)

我有这个输入,我想改变它的状态,使它可以是只读或可编辑的。

<input type="text" data-bind="attr: {readonly: isViewMode || isNotEditableInvoice}, value: model.DateFormatted" />

问题是当我不用括号来表示变量时。
第一种情况:isViewMode = trueisNotEditableInvoice = false =〉readonly的计算结果为true
第二例:isViewMode = falseisNotEditableInvoice = true =〉只读被评估为假
我也有这个按钮,我想只在用户处于编辑模式时显示它。

<input type="button" value="Save" data-bind="visible: !isReadOnly || isEditableInvoice,click: onUpdate" />

我在使用括号时也有类似的问题,我想知道那里发生了什么。
第三种情况:isReadOnly = falseisEditableInvoice = false =〉可见设置为假
第四例:当我对isReadOnly使用括号时,它工作得很好,结果和上面的一样,但是不知何故它被求值为true。为什么isEditableInvoice在没有括号的情况下被排除在求值之外?
为什么在我不用括号的情况下会发生这种情况,这背后的逻辑是什么?

3yhwsihp

3yhwsihp1#

因为knockout解析器/绑定器检查您是否绑定了一个表达式(而不是一个属性),所以它将按原样计算表达式。
除非显式调用计算a.k.a并在末尾添加括号,否则您只是在计算表达式'!isReadOnly||isEditableInvoice“,并且字段不被视为可观察的,而是照原样处理。
isReadOnly在js条件下被评估为非未定义,因此为true。
例如,针对单个属性进行的不同绑定类似于if/visible绑定。
你能做到

data-bind="if: model.someObservableProp"

但你不能这样做

data-bind="if: !model.someObservableProp"

不加括号,比如:

data-bind="if: !model.someObservableProp()"

因为一旦添加了!运算符,解析器就会将其视为js表达式,而不是可观察的字段

相关问题