Knockout.js 如果两个依赖路径的可观察性发生变化,则在单个动作上多次触发计算的敲除

Knockout.js 如果两个依赖路径的可观察性发生变化,则在单个动作上多次触发计算的敲除,knockout.js,Knockout.js,我有一个绑定到UI元素的可观察A。 我还有一个依赖于a的计算B。 我有一个计算的С,它取决于a和B。 我订阅了C 当UI元素中的值发生更改时,将计算两次,并调用两次订阅 我认为原因是A有两个订阅: A:[B,C] 敲除通知B A中的更改。 对B进行评估后,将B的变化通知C 然后它返回到开始并调用A的第二个订阅,即C。 这里我们有两个呼叫C 有没有办法防止这种情况 var viewModel = { firstName: ko.observable("Andrew"), lastN

我有一个绑定到UI元素的可观察A。 我还有一个依赖于a的计算B。 我有一个计算的С,它取决于a和B。 我订阅了C

当UI元素中的值发生更改时,将计算两次,并调用两次订阅

我认为原因是A有两个订阅: A:[B,C]
敲除通知B A中的更改。
对B进行评估后,将B的变化通知C
然后它返回到开始并调用A的第二个订阅,即C。
这里我们有两个呼叫C

有没有办法防止这种情况

var viewModel = {
    firstName: ko.observable("Andrew"),
    lastName: ko.observable("King"),
};

viewModel.fullName = ko.computed(function() {
    return viewModel.firstName() + " " + viewModel.lastName();
});

viewModel.user = ko.computed(function() {
    return {
    fullName: viewModel.fullName(),
    lastName: viewModel.lastName()
  };
});

viewModel.user.subscribe(function() {
    // This is called once if I change first name
    // It is called twice if I change last name
});

当可观察对象的一个依赖项发生变化时,可观察对象将重新计算。因为每次跑步都要创建一个新对象,所以knockout无法判断是否有实际变化

使用一个延迟的计算方法修复它 要防止它在两个依赖项都发生更改时多次运行,可以将其延迟:

var viewModel={
名字:ko.observable(“安德鲁”),
姓氏:ko.observable(“国王”),
};
viewModel.fullName=ko.computed(函数(){
返回viewModel.firstName()+“”+viewModel.lastName();
});
viewModel.user=ko.computed(函数(){
返回{
fullName:viewModel.fullName(),
lastName:viewModel.lastName()
};
}).extend({deferred:true});
viewModel.user.subscribe(函数(用户){
console.log(用户);
});
viewModel.firstName(“约翰”);
viewModel.lastName(“Doe”)