Knockout.js中如何让suspendableSubscribe订阅赋相同值时也触发回调
问题原因
你当前用的supsendableSubscribe(疑似拼写错误,正确应为suspendableSubscribe)是基于Knockout observable的默认触发规则:只有当新赋值与observable的当前值不相等时,才会触发订阅的回调函数。因此你多次点击同一个服务id时,vm.selectedServiceId的值没有发生实际变更,自然不会触发changeServiceId逻辑。
解决方案
方案1:赋值后强制触发通知(改动最小,无副作用)
直接在setServiceId函数中,给vm.selectedServiceId赋值后,调用Knockout内置的valueHasMutated()方法,强制触发所有订阅,无论值是否变化:
function setServiceId(serviceId) { vm.selectedServiceId(serviceId); // 新增以下行,强制触发订阅 vm.selectedServiceId.valueHasMutated(); jQuery.post(rootUrl + 'spaemployeeadmin/GetFirstSearchFilterDateForParent', { locationId: vm.selectedLocationId() }) .done(function (data) { var dateObj = { day: data.Day, month: data.Month, year: data.Year }; vm.refreshData(dateObj, null); }); }
方案2:修改observable默认通知规则
如果需要这个selectedServiceId永远在赋值时触发通知,不管值是否变更,可以在定义observable时扩展notify: 'always'配置:
// 定义时修改,示例如下 vm.selectedServiceId = ko.observable().extend({ notify: 'always' });
改完之后无需调整setServiceId的原有逻辑,每次赋值都会自动触发changeServiceId回调。
方案3:直接手动调用回调
如果不想修改observable的规则,也可以直接在setServiceId中手动调用changeServiceId,同时可以注销原来的订阅避免重复触发:
// 注销原有订阅 serviceIdSubscrier.dispose(); function setServiceId(serviceId) { vm.selectedServiceId(serviceId); // 手动调用目标逻辑 changeServiceId(); jQuery.post(rootUrl + 'spaemployeeadmin/GetFirstSearchFilterDateForParent', { locationId: vm.selectedLocationId() }) .done(function (data) { var dateObj = { day: data.Day, month: data.Month, year: data.Year }; vm.refreshData(dateObj, null); }); }
注意事项
注意你代码中supsendableSubscribe为拼写错误,正确写法为suspendableSubscribe,避免后续功能异常。
内容的提问来源于stack exchange,提问作者lonelydev101
相关产品推荐
相关产品推荐

