您好,我在扩展 observableArray 的扩展器“paged”中有一个 KnockoutJs 计算的 observable ItemCountText。observableArray 是 Products。
这按预期工作,给了我“32 个产品”(32、48,无论数字是多少,加上“产品”或我传递到扩展器设置中的任何文本)
<span data-bind="text:Products.ItemCountText"></span>
.. 但是这个
<!-- ko with: Products -->
<span data-bind="text:ItemCountText"></span>
<!-- /ko -->
... 因错误而中断:无法解析绑定。消息:ReferenceError:ItemCountText 未定义;绑定值:文本:ItemCountText
尽管定义了“Products.ItemCountText”绑定,但导致扩展器计算的可观察 ItemCountText 未在“with: Products”中定义的问题可能是什么?感觉好像“ko with:”的绑定机制无法“进入”扩展程序。
这是一个演示这个问题的小提琴。为了避免分心,分页扩展器已将与问题无关的所有内容都剪掉了。
要遇到上述问题,请取消注释小提琴的 HTML 第 14 行并运行
淘汰赛是版本 2.2.1
这是 JsFiddle 的 HTML
<div id="bindMe">
<span data-bind='text: Yay()'></span>
<div data-bind="text: Products.ItemCountText"></div>
<div><span data-bind="text: Products().length"></span> on this page</div>
<!-- ko with: Products -->
<ul>
<!-- ko foreach: $data -->
<li data-bind="text: $data"></li>
<!-- /ko -->
</ul>
<!-- /ko -->
<span data-bind='text: Boo'></span>
<!-- ko with: Products -->
<!-- <div data-bind="text: ItemCountText"></div> -->
<div><span data-bind="text: length"></span> on this page</div>
<ul>
<!-- ko foreach: $data -->
<li data-bind="text: $data"></li>
<!-- /ko -->
</ul>
<!-- /ko -->
</div>
这是 JsFiddle 的 Javascript
ko.extenders.paged = function (target, options) {
// Settings
var settings = $.extend({
"itemcounttext": 'Counted Items'
}, options);
target.TotalRecords = ko.observable();
target.ItemCountText = ko.computed(function () {
return target.TotalRecords() + " " + settings.itemcounttext;
});
return target;
};
/// -- End paging extender -- \\\
var ViewModel = function() {
var self = this;
self.Yay = ko.observable("Hello World... Products.ItemCountText.. it works great");
self.Boo = ko.observable("But if HTML line 14 is uncommented, why does ItemCountText from extender broke using ko with?");
self.Products = ko.observableArray([]).extend(
{
paged:
{
"itemcounttext": 'Products in total'
}
});
};
var myViewModel = new ViewModel();
ko.applyBindings(myViewModel, document.getElementById("bindMe"));
myViewModel.Products.push('prod a');
myViewModel.Products.push('prod b');
myViewModel.Products.push('prod c');
myViewModel.Products.TotalRecords(5);