gpt4 book ai didi

javascript - 为什么一个函数表现得像一个计算函数?

转载 作者:数据小太阳 更新时间:2023-10-29 05:15:49 24 4
gpt4 key购买 nike

给定以下 HTML/JS ( http://jsfiddle.net/mgs_jsfiddle/gUhm2/ )

<div data-bind="foreach: users">
<p data-bind="click: $root.onClick">
<span data-bind="text: id"></span>
<span data-bind="text: firstName"></span>
<span data-bind="text: $root.isSelected($data)"></span>
</p>
</div>

$(function() {
function ViewModel() {
var self = this;
self.users = [
{ id: 1, firstName: "Bob" },
{ id: 2, firstName: "David" },
{ id: 3, firstName: "Walter" }
];
self.selectedId = ko.observable(1);
self.isSelected = function(user) {
return user.id === self.selectedId() ? "YES" : "NO";
};
self.onClick = function(user) {
self.selectedId(user.id);
}
};
ko.applyBindings(new ViewModel());
});

显示一个列表。通过单击一行,该行的 ID 将存储到 selectedId 中。

我不明白,为什么当 selectedId 改变时函数 isSelected 被重新评估。毕竟,这不是计算出来的。为什么要重新评估?

最佳答案

发生这种情况是因为 isSelected() 方法访问 selectedId 属性(可观察)。考虑一下:

HTML

<!-- adding into the foreach: block  -->
<span data-bind="text: $root.someFunc()"></span>
<span data-bind="text: $root.someOtherFunc()"></span>

JS

// adding to a model definition
self.someFunc = function() {
self.selectedId();
console.log('I AM AN OBSERVER');
return 'oi: ' + Math.random();
};
self.someOtherFunc = function() {
// self.selectedId();
console.log('AND I AM NOT');
return 'no: ' + Math.random();
}

Fiddle .

如您所见,这些函数之间的唯一区别在于第一个函数会检查定义为 ko.observable 的模型属性的值。因此,每次 self.selectedId 更改时,都会通知此函数(这实际上意味着它会重新运行)。

请注意,如果您删除相应的 data-bind 部分,则此方法将不会在 View 初始化阶段运行,因此无法注册为适当的观察者。

第二个方法虽然也在初始化阶段调用,但不会尝试检查 selectedId 值 - 因此它不会注册为该值的观察者,并且不会在后续调用。

关于javascript - 为什么一个函数表现得像一个计算函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com