Knockout.js knockoutjs extender可观察未知通过绑定

Knockout.js knockoutjs extender可观察未知通过绑定,knockout.js,Knockout.js,您好,我有一个KnockoutJs计算的observable ItemCountText,它位于一个扩展页中,扩展了observable Array。最重要的是产品 这和预期的一样,给了我32个产品32、48,不管数字是多少,加上产品或我传递到扩展器设置中的任何文本 <span data-bind="text:Products.ItemCountText"></span> 问题是,在数据实际位于ItemCountText之前,您的observable被创建并绑定到视图

您好,我有一个KnockoutJs计算的observable ItemCountText,它位于一个扩展页中,扩展了observable Array。最重要的是产品

这和预期的一样,给了我32个产品32、48,不管数字是多少,加上产品或我传递到扩展器设置中的任何文本

<span data-bind="text:Products.ItemCountText"></span> 

问题是,在数据实际位于ItemCountText之前,您的observable被创建并绑定到视图-

通过附加$data。在前面,它告诉Knockout,只有当它有值时才绑定它,基本上延迟绑定直到ItemCountText有值

编辑更新

您的with:绑定将忽略扩展属性,因为您将上下文绑定到数组的值,而数组的值不包括这些扩展属性

<!-- ko with: Products -->
<span data-bind="text: $data"></span>
当您绑定到:产品时,它几乎与绑定到可观察值时相同——不属于可观察值一部分的该对象的任何其他属性都将被忽略


如果您必须使用绑定在无容器中进行绑定,请使用$parent.Products使其返回-

在自定义绑定实验失败后,我仍然无法访问扩展器的属性,我发现了一个相当简单的解决方案,即声明一种指向“分页”扩展器的指针

产品和更改都是通过名为“paged”的扩展进行扩展的

self.Products.Paged = ko.computed(function() {
    return self.Products['extend']('paged');
});

self.Changes.Paged = ko.computed(function() {
    return self.Changes['extend']('paged');
});
现在,我可以使用无容器的“with”绑定来包含使用名为“paged”的扩展器属性的my _Pager视图,现在任何由“paged”扩展的内容都可以绑定到my _Pager视图

<!-- ko with: Products.Paged -->
    @Html.Partial("_Pager",Model)
<!-- /ko -->


现在我已经发现了这一点,我打赌可以编写一个自定义绑定来进行指向,这样指针就不需要添加到所有扩展的内容中。取而代之的是,名为withExtension的自定义绑定可能会接受扩展名,允许

预先添加任何上下文标记将隐藏问题,使其不会在javascript控制台中显示为错误,但绑定仍然无法成功。您的提琴在下半部分也没有显示总共5种产品。您正在将上下文绑定到ObservalArray的值,而不是要扩展的父对象。整个事情是,它是一个分页扩展程序。我要做的是重用它和绑定到它的分页视图。因此:ChangeLog将无法重用包含$parent.Products的视图。如果使用的ko无法执行此操作,是否有任何方法可以访问扩展程序的属性,从而使视图可以在不同的分页数组上重用?您将其绑定到可观察数组的顶部,如果您希望每个对象都具有该属性,而不是设置一个具有ObservalArray属性的父可观察对象并在那里设置该属性…设置一个具有ObservalArray属性的父可观察对象并在那里设置该属性。。谢谢你,我想这应该行得通,但是我仍然想知道为什么text:Products.ItemCountText可以作为绑定工作,但是对于:Products,text:ItemCountText失败了。两种方法应该是一样的,不是吗?
<div data-bind="text: $data.ItemCountText"></div>
<!-- ko with: Products -->
<span data-bind="text: $data"></span>
self.Products.Paged = ko.computed(function() {
    return self.Products['extend']('paged');
});

self.Changes.Paged = ko.computed(function() {
    return self.Changes['extend']('paged');
});
<!-- ko with: Products.Paged -->
    @Html.Partial("_Pager",Model)
<!-- /ko -->
<!-- ko with: Changes.Paged -->
    @Html.Partial("_Pager",Model)
<!-- /ko -->