我最近更新到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页面开始,我认为我已经遵循了所有步骤,但无法理解为什么它不会被解雇......
答案 0 :(得分:0)
我已经解决了这个问题,在jsfiddle中模拟了所有工作,所以在缩小场景中的不同之处时,我的ko.applyBindings被分割出某些元素。事实证明,添加的新组件不在其范围内,因此只需将其添加到现有applyBindings目标的范围内。