javascript - KnockoutJS 查找 ko.observable() 长度

标签 javascript if-statement mvvm knockout.js

编辑为什么计算出的长度不会保存?

有没有办法仅在精度为 1、2 或 3 时才对可观察量进行数据绑定(bind)?下面是我的虚拟机:

function FFS_ViewModel() {
    var self = this;
    .....
    self.SortOrder = ko.observable();
    self.SortOrderLen = ko.computed(function(){
          return self.SortOrder().length; // **Error Here: Cannot read property 'length' of undefined**
    });
    self.Description = ko.observable();
    self.records = ko.observableArray([]);
})

这是 View :

<table class='TFtable'>
   <thead>
       <tr>
         <th>Sort Order</th>
       </tr>
   </thead>
   <tbody data-bind="foreach: records">
       <tr id="mainFactors">
            <td data-bind="if: SortOrderLen === 2"></td>
            <td data-bind="text: Description"></td>
       </tr>
   </tbody>
</table>

最佳答案

问题 1:

当初始化一个不带参数的observable时,它的值变成undefined:

self.SortOrder = ko.observable();
console.log(self.SortOrder()); // Prints: undefined

当尝试访问未定义的属性时,会抛出错误:

(undefined).length; // Throws: Cannot read property 'length' of undefined

修复1:

确保您的计算可以处理未定义值:

self.SortOrderLen = ko.computed(function() {
  if (!self.SortOrder()) return 0;

  return self.SortOrder().length;
});

或确保使用有效值初始化SortOrder:

self.SortOrder = ko.observable([]);

问题 2:

当您想使用计算或其他可观察的值时,您需要调用它(它是一个函数)。

self.SortOrder;    // Returns the `computed` instance
self.SortOrder();  // Returns the actual value inside

因此,此绑定(bind)将不起作用:

// never `true`, since a ko.computed !== 2
data-bind="if: SortOrderLen === 2" 

修复 2:

解开绑定(bind)中的值:

data-bind="if: SortOrderLen() === 2"

关于javascript - KnockoutJS 查找 ko.observable() 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771227/

相关文章:

javascript - SIFR 的替代方案

JavaScript 循环未完成

wpf - 重构 WPF MVVM 以提高可测试性

python - If 语句不起作用 (Python)

.net - 根据行值更改数据网格的行详细信息的数据模板

c# - 在 WPF 中的远程桌面连接 (RDP) 后重新加载 View

javascript - JS树加载时间问题

javascript - telerik radGrid - 在排序/分页/过滤器上保持客户端状态

javascript - style.display ="none"不工作

java - 在Java中,是否有某种编码方法比过多的if..else语句更好?