为了账号安全,请及时绑定邮箱和手机立即绑定

Knockout JS 订阅 2 个 observables 的方式是,如果 2 个

Knockout JS 订阅 2 个 observables 的方式是,如果 2 个

郎朗坤 2022-06-09 10:33:28
我有一个时间戳过滤器,用户可以在其中更改开始和结束时间。哪个用户更改了 2,订阅回调中的任何一个都可以正常工作。但是,当用户在一种编辑模式下同时更改开始和结束时间时,我的订阅函数会按预期被调用两次。我想避免这种情况,我希望它只被调用一次。关于如何实现这一目标的任何建议?
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

在 KO 3.4.0+ 中,您可以在计算上使用延迟更新,该计算依赖于两者start,并且end以一种导致更改的方式,即使start并且end以互补方式更改:


let eitherX = 1;

const either = ko.computed(() => {

    start();

    end();

    return ++eitherX;

});

either.extend({deferred: true});

现场示例:


显示代码片段


在早期版本中,您可以使用以下速率限制:0


let eitherX = 1;

const either = ko.computed(() => {

    start();

    end();

    return ++eitherX;

});

either.extend({rateLimit: 0});

现场示例:

const start = ko.observable(10);

const end = ko.observable(20);

let eitherX = 1;

const either = ko.computed(() => {

    start();

    end();

    return ++eitherX;

});

either.extend({rateLimit: 0});


console.log("Subscribing");

// Applying the rate limit

either.subscribe(() => console.log("notified"));

console.log("changing start");

start(11);

console.log("changing end");

end(19);

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>


您需要eitherX使either重新计算时的值始终不同。如果你试图用eitherandstart来定义end(例如start() + end()),如果你改变了startandend以互补的方式(加一start和减一end),either' 的值不会改变,你也不会收到任何通知。


查看完整回答
反对 回复 2022-06-09
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

当您以编程方式同时更改两个过滤器并且只希望触发一次回调时,上面的 Crowder 是正确的,当您等待用户一个接一个地更改过滤器时,这是另一回事。

在更改开始时间之后,真的无法知道用户是否会更改结束时间,那么您如何知道等待开始时间触发器最终触发的时间?

唯一的选择是在 2 个输入过滤器之后添加一个按钮,上面写着“确认过滤器”并触发回调。

实际上,还有另一种方法,但涉及有效地执行两次回调,其中第一次在第二次触发时被取消,这可能是您希望避免的事情,对吧?


查看完整回答
反对 回复 2022-06-09
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号