knockoutjs中方法的区别

时间:2011-08-17 10:47:09

标签: javascript knockout.js

getFullName1和getFullName2之间的区别是什么?

视图模型:

var viewModel = {
    firstName: ko.observable("Vasya"),
    lastName: ko.observable("Petrov"),
    getFullName1: function() {
        return this.firstName() + " " + this.lastName();
    }
};

viewModel.getFullName2 = ko.dependentObservable(function() {
    return this.firstName() + " " + this.lastName();
}, viewModel);

// Activates knockout.js
ko.applyBindings(viewModel);

模板

<p>Full name 1: <span data-bind="text: getFullName1()">todo</span></p>
<p>Full name 2: <span data-bind="text: getFullName2()">todo</span></p>
<p>First name: <input data-bind="value: firstName"></p>

1 个答案:

答案 0 :(得分:6)

一些事情:

  • getFullName1未绑定到您的viewModel,因此根据其调用位置,this的值可能不是您的viewModel。这在Knockout中尤其重要,在Knockout中,您的代码被间接调用,并且传递对函数的引用。这可能不会影响您,但在处理集合/模板时尤其起作用。

  • 绑定是使用dependentObservables实现的,因此在使用它时,当firstName或lastName发生更改时,它们都会更新它们的跨度。

  • 因为getFullName2是dependentObservable,所以当它的一个依赖项发生变化时,它会自动更新。它是否与任何东西绑定无关紧要。它还有其他功能,例如创建针对它的手动订阅。

  • 您也可以使用dependentObservable说test: getFullName2,因为它会被解包。

  • 但最重要的原因是dependentObservable只在其依赖项发生变化且其实际值缓存在其中时才会更新。所以,如果我拨打getFullName1 100次,那么它将完成所有100次的工作。如果我调用了getFullName2 100次,它只会返回它在创建时或依赖项上次更改时计算的最新值。