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

为什么以这种方式更改此格式化函数会导致 Knockout 绑定开始工作?

为什么以这种方式更改此格式化函数会导致 Knockout 绑定开始工作?

函数式编程 2023-09-07 16:55:25
我在页面上有一个元素,如下所示:<span data-bind="text: FormattedCountOfPeople"></span>计算它的函数我首先是这样写的:self.FormattedCountOfPeople = ko.computed(function () {    if(!self.PeopleCountFormatString)                 //a string like "{0} people in the conference", but set by a service call so starts out undefined      return "not set yet";    let sizes = self.Params().PermittedCounts();      //an array of discrete permitted sizes e.g. [2, 10, 30]    let size = self.Params().ChosenCount();           //value set by a jquery slider, could be any double, even 5.7435 - to achieve smooth dragging of the slider it has a small step but snaps to a permitted count    let n = nearest(size, sizes);                     //a "round to nearest" helper function that given args of e.g. (5.7345, [2, 10, 30]) will pick 2 because 5.7345 is nearer to 2 than 10    let s = self.PeopleCountFormatString.csFormat(n); //csformat is a helper function that performs C# style string Formatting e.g. "{0} people".csFormat(2) -> "2 people"    return s;});我绕了好几个小时,想知道为什么无论滑块设置是什么,页面上的文本都卡在“尚未设置”处,但是作为测试添加的另一个元素正在完美更新,而其他地方有一个不同的<span data-bind="text: Params().ChosenCount"></span>滑块使用类似的逻辑设置小时和分钟的持续时间就可以了://if the user picks 61.2345, it rounds to 60, then returns "1 hour". Picking 74.11 rounds to 75 then returns "1 hour, 15 min"self.FormattedDurationText = ko.computed(function () {    var duration = self.Params().ChosenDuration();      duration = Math.round(duration / 15) * 15;});在不同的地方添加一些控制台日志记录,很明显,在第一次调用FormattedCountOfPeople返回“尚未设置”后,FormattedCountOfPeople拖动人数统计滑块时再也不会被调用。直接绑定到原始数据的另一个范围Params().ChosenCount会不断更新,因此值可以正常变化。类似地,绑定到的滑块Params().ChosenDuration正在更新值,并且FormattedDuration()每次值更改时都会被调用,并提供一个新的格式化字符串以进入范围
查看完整描述

1 回答

?
慕标琳琳

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

当您在计算中引用可观察量时,KO 将在内部订阅该可观察量,因此每次可观察量发生变化时都会重新评估计算值。

当您在计算开始时执行此操作时:

if(!self.PeopleCountFormatString)
  return "not set yet";

并且self.PeopleCountFormatString 不是可观察的(它似乎不是),由于 return 语句,您的计算不会进一步评估,订阅永远不会ChosenCount发生,并且因为PeopleCountFormatString它本身也不是可观察的,所以计算的不是稍后重新评估何时PeopleCountFormatString确实有价值。因此,它的价值将永远保持“尚未确定”。

更新后的计算值可以工作,因为您立即引用其他可观察值,因此 KO 将在内部订阅这些可观察值,并在可观察值发生变化时重新评估计算值。


查看完整回答
反对 回复 2023-09-07
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信