0

Knockoutjs Docs我不明白这句话:
模板已经注入到这个元素中,但还没有绑定。

ko.components.register('my-component', {
viewModel: {
    createViewModel: function(params, componentInfo) {
        // - 'params' is an object whose key/value pairs are the parameters
        //   passed from the component binding or custom element
        // - 'componentInfo.element' is the element the component is being
        //   injected into. When createViewModel is called, the template has
        //   already been injected into this element, but isn't yet bound.

        // Return the desired view model instance, e.g.:
        return new MyViewModel(params);
    }
},
template: ...
});
4

2 回答 2

1

新的 MyViewModel(参数);

MyViewModel是所需的视图模型实例。这是用于淘汰赛的工厂设计模式。

如果您想在关联元素绑定到视图模型之前对其运行任何设置逻辑,或者使用任意逻辑来决定要实例化哪个视图模型类: factory function.

将根据您在运行时的逻辑来选择视图模式。


模板已被注入此元素,但尚未绑定。

一旦您返回所需的视图模式,它将绑定到您的ko.components.

于 2015-01-01T10:08:26.450 回答
1

所以假设“我的组件”的模板是(不管它是如何定义的)

<span class="foo" data-bind="text: 'foo'"></span>

“模板已经被注入到这个元素中,但还没有被绑定”这句话描述了给定组件的 DOM 状态。(AKAcomponentInfo.elementcreateViewModel函数的上下文中)

通过绑定组件的过程,组件的 DOM 如下所示:

在模板被注入组件之前:

<my-component></my-component>

在模板被注入组件之后,但在绑定发生之前:(这是调用时 DOM 的状态createViewModel,因此是注释)

<my-component>
    <span class="foo" data-bind="text: 'foo'">
    </span>
</my-component>

绑定发生后:(这只能在creteViewModel返回 ViewModel 后发生)

<my-component>
    <span class="foo" data-bind="text: 'foo'">
         foo
    </span>
</my-component>

span 在最后一步中只有文本,因为现在已经应用了绑定,并且text绑定已将文本添加到组件中。


该注释旨在表明 DOM 处于第二种状态,这意味着您可以根据需要从createViewModel函数中操作 Component 的 DOM 元素,尽管 KO 文档建议不要这样做:

请注意,通常,最好仅通过自定义绑定执行直接 DOM 操作,而不是从 createViewModel 内部对 componentInfo.element 进行操作

于 2015-01-03T06:31:32.857 回答