KnockoutJS 查找 ko.observable() 长度
Posted
技术标签:
【中文标题】KnockoutJS 查找 ko.observable() 长度【英文标题】:KnockoutJS Find ko.observable() length 【发布时间】:2018-07-24 02:01:06 【问题描述】:编辑为什么不保存计算的长度?
只有当一个 observable 的精度为 1、2 或 3 时,有没有办法对它进行数据绑定?下面是我的虚拟机:
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([]);
)
这里是视图:
<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>
【问题讨论】:
应该SortOrder
成为observableArray
,因为您想使用它的length
?如果应该是字符串,初始化为''
【参考方案1】:
问题一:
在不带参数的情况下初始化observable
时,其值变为undefined
:
self.SortOrder = ko.observable();
console.log(self.SortOrder()); // Prints: undefined
尝试访问undefined
的属性时,抛出错误:
(undefined).length; // Throws: Cannot read property 'length' of undefined
修复 1:
要么确保您的计算可以处理undefined
值:
self.SortOrderLen = ko.computed(function()
if (!self.SortOrder()) return 0;
return self.SortOrder().length;
);
或确保 SortOrder
已使用有效值初始化:
self.SortOrder = ko.observable([]);
问题2:
当您想使用computed
或其他observable
的值时,您需要调用它(它是一个函数)。
self.SortOrder; // Returns the `computed` instance
self.SortOrder(); // Returns the actual value inside
因此,此绑定不会起作用:
// never `true`, since a ko.computed !== 2
data-bind="if: SortOrderLen === 2"
修复 2:
解开绑定中的值:
data-bind="if: SortOrderLen() === 2"
【讨论】:
这个答案比我的要完整得多,建议先运行这个,但还是看看我的答案中给出的实现选项。 感谢详细的解释!信息量很大 我真的很喜欢你的回答!【参考方案2】:您可以为此使用可见绑定:
data-bind="visible: shouldShow"
或者您也可以在评论中执行 if 逻辑
<!-- ko if: someExpressionGoesHere -->
<td>show element</td>
<!-- /ko -->
【讨论】:
我喜欢对这类事情使用注释技术,但有一个有效的论点认为这会使 DOM 变得混乱 谢谢,你能告诉我我的表达是否正确吗?以上是关于KnockoutJS 查找 ko.observable() 长度的主要内容,如果未能解决你的问题,请参考以下文章
KnockoutJS 查找 ko.observable() 长度
KnockoutJS 3.X API 第七章 其他技术 异步错误处理