自定义元素未在knockoutjs 3.2.0中处理

时间:2014-09-13 22:54:49

标签: javascript knockout.js typescript knockout-components

我最近更新到3.2,我真的想要使用自定义元素和组件绑定。

现在我已经制作了一个这样的自定义组件加载器:

export class KnockoutComponentLoader implements IKnockoutTemplateLoader, IKnockoutViewModelLoader
{
    public loadTemplate(name: string, templateConfig: any, callback:Function)
    {
        console.log("Loading template: {0}".format(name));
        // Do some other stuff
    }

    public loadViewModel(name: string, viewModelConfig: any, callback:Function)
    {
        console.log("Loading vm: {0}".format(name));
        // Do some other stuff
    }
}

它是一个打字稿模块,但它被转换为JS并使用:

注册
var knockoutComponentLoader = new Framework.Loaders.KnockoutComponentLoader();
ko.components.loaders.unshift(knockoutComponentLoader);

我已经在FF中进行了调试,并且所有内容似乎都按预期工作,然后我会在几行之后进行以下注册:

componentConfigurator.RegisterComponent("heading-menu", "shared", "HeadingMenuVM", "heading-menu");

我有一个用自定义加载器包装注册的类:

export class ComponentConfigurator implements IComponentConfigurator
    {
        public RegisterComponent(componentName: string, moduleName: string,  viewModelName: string, templateName: string)
        {
            var configuration = this.GetComponentConfiguration(moduleName,  viewModelName, templateName);
            ko.components.register(componentName, configuration);
        }

        public GetComponentConfiguration(moduleName: string,  viewModelName: string, templateName: string) : any
        {
            return {
                viewModel: {
                    moduleName: moduleName,
                    name: viewModelName
                },
                template: {
                    moduleName: moduleName,
                    name: templateName
                }
            };
        }
    }

这里的模块不是js模块,它是我们框架中的另一个概念。无论如何,当调用ko.applyBindings()并且页面上有自定义元素组件的实例时,所有寄存器都按预期进行,即:

<heading-menu></heading-menu>

没有控制台日志消息是spat out,标题菜单没有注入相关模板等。因此忽略加载器的具体实现细节,只需查看加载器和组件的注册以及元素使用情况应该这有用吗?

从KO页面开始,我认为我已经遵循了所有步骤,但无法理解为什么它不会被解雇......

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,在jsfiddle中模拟了所有工作,所以在缩小场景中的不同之处时,我的ko.applyBindings被分割出某些元素。事实证明,添加的新组件不在其范围内,因此只需将其添加到现有applyBindings目标的范围内。