在Knockout.js视图中,什么时候将可观察对象作为函数调用?

whlutmcx  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(115)

我很难从official documentation for the hasFocus binding执行此示例
查看方式:

<p>
    Name: 
    <b data-bind="visible: !editing(), text: name, click: edit">&nbsp;</b>
    <input data-bind="visible: editing, value: name, hasFocus: editing" />
</p>
<p><em>Click the name to edit it; click elsewhere to apply changes.</em></p>

视图模型:

function PersonViewModel(name) {
    // Data
    this.name = ko.observable(name);
    this.editing = ko.observable(false);

    // Behaviors
    this.edit = function() { this.editing(true) }
}

ko.applyBindings(new PersonViewModel("Bert Bertington"));

我的困惑来自于“编辑”可观察对象,它没有被声明为函数,但在视图中被调用时就像是一个具有!editing()的函数,而不是一个具有visible: editinghasFocus: editing的函数。
我已经阅读了www.example.com上的文档knockoutjs.com但是不知道从视图中引用可观察对象的规则是什么。如果我有一个可观察的foo,我什么时候在视图中引用它作为foo(),什么时候引用它作为foo?

nlejzf6q

nlejzf6q1#

有一个简单的解释:* 所有可观察的都是函数 *。所以,在这个例子中,editing实际上是一个函数。你必须调用(或者用KO术语“unwrap”)它来得到它的当前值,这就是为什么你要加括号的原因。
当您将一个可观察对象传递到一个默认绑定中时,该绑定实际上会为您执行这种展开(例如,可见绑定的source)。但是,当你 * 求反 * 一个可观察值并想使用它时,就像你对!editing()所做的那样,你需要首先调用它来得到它的值。!editing的结果总是false。因为editing是一个函数,其计算结果总是true。而!editing()的结果是editing的当前值的求反版本。

相关问题