You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Knockout中data-bind使用||出现重复结果问题求助

解决Knockout中visible绑定用||时重复显示的问题

嘿,我来帮你排查这个问题!首先得揪出你代码里可能存在的关键问题——observable的访问方式

你看,在Knockout里,如果worktask.wbc_date是一个observable(这是很常见的定义方式),直接用worktask.wbc_date去做比较的话,其实是在拿这个observable函数对象本身和其他值对比,而不是它存储的实际值。但你调用$root.FirstViewOnlyDate()是正确的,因为加了()来获取observable的当前值,这就导致两边的对比逻辑不对,出现了意外的结果。

第一步:修正绑定表达式的取值方式

worktask.wbc_date改成worktask.wbc_date(),确保你在比较的是实际值,而不是observable对象本身。同时推荐用===做严格相等判断,避免类型转换带来的坑:

<div data-bind="visible: ( worktask.wbc_date() === $root.FirstViewOnlyDate() || worktask.wbc_date() === null )">
  <!-- 你的内容 -->
</div>

为什么之前用===没结果?

因为你之前没加()worktask.wbc_date是一个函数对象,和$root.FirstViewOnlyDate()的返回值(或者null)做严格相等对比,肯定不相等,所以返回false,元素就被隐藏了。

如果还是有重复显示的问题?

如果修正取值后,当两个条件同时为真时还是重复显示,那大概率是这个div被包含在foreach循环里,而且有两个不同的worktask分别满足其中一个条件(比如一个的wbc_date等于FirstViewOnlyDate,另一个的wbc_date是null)。这时候用||就会让两个div都显示,看起来像是“重复”。这种情况的话,你需要检查循环的数据源,确认是不是有多个符合条件的项。

更优雅的写法:用computed observable

如果绑定表达式里的逻辑比较复杂,推荐把判断逻辑放到viewmodel里的computed observable中,这样代码更清晰,也更容易调试:

// 假设这是worktask的viewmodel
function WorkTaskViewModel(data) {
  var self = this;
  self.wbc_date = ko.observable(data.wbc_date);
  
  // 定义computed属性来判断是否显示
  self.shouldShowWbcDate = ko.computed(function() {
    return self.wbc_date() === $root.FirstViewOnlyDate() || self.wbc_date() === null;
  });
}

然后绑定就简化成:

<div data-bind="visible: shouldShowWbcDate">
  <!-- 你的内容 -->
</div>

内容的提问来源于stack exchange,提问作者Bakr

火山引擎 最新活动