1

我正在尝试使用淘汰组件创建一个页面,如果没有同时添加它们,我在尝试绑定页面中的多个组件时遇到了一些麻烦。据我所知,我无法直接访问组件的视图模型,将其绑定到特定元素。

ko.applyBindings(viewModel, document.getElementById("component1"));

我的问题是,因为我因此必须使用更通用的

ko.applyBindings()

如果我稍后将另一个组件添加到页面并想要绑定它,我会收到“您不能将绑定多次应用于同一元素”。错误。

我有什么方法可以访问组件视图模型并直接应用它吗?

$('body').append('<div id="compoent1" data-bind=\'component: { name:"someComponent"\}'></div>')
ko.applyBindings(viewModel/*How do I get this?*/, document.getElementById("component1"));

我试过只使用

ko.applyBindings(document.getElementById("component1"));

我的解释可能有点难以理解,这是我正在尝试做的伪代码:

Add a knockout component
Apply bindings for the knockout component
.... some time later in my single page application
Add another knockout component
Apply bindings for the new knockout component
4

1 回答 1

4

在我看来,您可能正在尝试使用非敲除方法添加组件。

一旦你进入淘汰赛,最好将所有内容都保留在淘汰赛中,并抵制为了“快速获胜”而重新使用 jQuery 或直接 DOM 操作的诱惑。它总是在以后咬你......所以:

 <foocomponent params="woo:'fwoo'"></foocomponent >
 <!-- ko if:someBooleanObservableThatChangesLater -->
     <myawesomecomponent params="choo:'boo'"></myawesomecomponent >
 <!-- /ko -->

现在我们通过更改根模型 ( someBooleanObservableThatChangesLater) 中的可观察对象“添加”了第二个组件。无需重新绑定。

您的情况可能与我上面相当简单的示例有所不同,但希望意图是明确的。observableArray您可以通过将项目推入并使用其上的绑定来获得类似的行为,foreach以便每当您更改observableArray. 再一次,不需要第二次调用applyBindings

于 2015-04-17T09:16:20.117 回答