我已经看到了其他线索,但我仍然感到困惑,我想我在这里提出了一个不同的案例.
我正在使用显示模式将视图模型对象返回到我的HTML文档.因此,我有一个看起来像这样的视图模型对象:
var vm = function() { var customProperty = ko.numbericObservable(0); return { customProperty: customProperty }; } ();
从这里,您可以看到customProperty被分配给初始值为0的Knockout数字observable.
在包含上面的JavaScript的HTML文档中,我有一个带有data-bind属性的SPAN元素,该属性订阅了customProperty observable,如下所示:
到现在为止还挺好.上面的工作正常,这意味着每当我在脚本中更改customProperty的值时,SPAN中的文本立即更新.例如,我可以成功轻松地使用此表达式将customProperty observable的值从0更改为10:
vm.customProperty(10);
我的问题:
请注意,在引用customProperty
data-bind属性中的值时,我没有使用括号.为什么不要求括号?
我发现使用括号也有效:
我理解为什么使用括号工作(因为我正在读取Knockout observable的值).但为什么括号不需要呢?换句话说,为什么第1点的数据绑定表达式会起作用?
最后,这项任务实际发生了什么?
var customProperty = ko.numericObservable(0);
customProperty
最终是否持有一个指向函数的指针customProperty()
?
当ko解析绑定时,它会检查表达式是否是一个observable,正如你所知道的那样是一个函数.如果表达式是可观察的,ko会自动展开值以显示它,但它也允许订阅和通知.
在这种情况下,当ko解析表达式时,它会找到一个值,而不是一个可观察的值,因此,它也可以正常显示值(值更改>视图更新).但是,您将失去从视图到值的绑定(输入值更改> observable未更新),因为它不是可观察的.有关更多详细信息,请参阅下面的说明和摘要.
customProperty
是一个函数,特别是一个函数,ko.observable
它意味着支持订阅和通知,除了使用()
或(newValue)
语法读取或设置值
注意:使用和不使用括号之间的差异是巨大的.如果你这样做:
正如我在1中解释的那样,ko发现这
customProperty
是一个可观察的,所以当用户更改其中的值时input
,新值将被写回observable.如果你这样做:正如我在2中解释的那样,ko找到了一个值,而不是一个可观察的值.因此,如果用户
input
通过键入来更改其值,则新值不会反馈给observable,因为ko不知道它是可观察的.(但是,如果更新了可观察值,则视图会更改,因为在表达式求值期间会发现并订阅依赖项).
var vm = { customProperty: ko.observable(10) }; ko.applyBindings(vm);
body { font-family: Segoe, Arial }
data-bind="value: customProperty()"
If you change the input text, customProperty is not updated
data-bind="value: customProperty"
If you change the input text, customProperty changes
customProperty value: