如何将 Durandal#composition 集成到淘汰赛模板引擎中

Posted

技术标签:

【中文标题】如何将 Durandal#composition 集成到淘汰赛模板引擎中【英文标题】:How to integrate Durandal#composition into knockout template engine 【发布时间】:2013-02-23 20:53:58 【问题描述】:

我使用允许模板用于渲染行的 kendo ui 网格。它使用 KO 模板引擎,它希望模板在标签中,但是我想将模板外部化并使用 Durandal Compose 插件......知道如何轻松挂钩吗?

【问题讨论】:

Kendo 绑定模型的原生方式与 Knockout 的方式非常相似,但又不一样。这是 MVVM 的两种完全不同的实现。然而,Durandal 是建立在 KO 之上的。 这在另一个帖子中得到了很好的回答:***.com/questions/15409941/… 【参考方案1】:

问题是从外部加载模板 async/。这是通过 durandal 的普通视图的 compose 绑定来完成的。剑道模板不支持这个。我现在的解决方案是通过组合绑定加载模板并让剑道网格使用它。事实上,我正在使用剑道淘汰赛,它支持剑道网格中的淘汰赛模板。所以我不必在 html 中编写 javascript (rowTemplate: kendo.template($("#rowTemplate").html()))。

唯一的问题是,如果我通过另一个模板加载网格,行绑定的组合不能在同一个模板内。应该是这样的

<html>
  <div data-bind="compose:view:rowTemplateFromServer"></div>
  <div data-bind="compose:view:templateWithKendoGridBindinh"></div>
</html>

这不利于维护或我的下一代开发人员......我认为我必须扩展淘汰赛剑道才能使用 durandal 组合绑定。 (knockoutkendo 确实支持外部模板,但它在 durandal 或 jquery 9 下不起作用)


固定:

我已经修改了 KoExternalTemplate 库中的 ExternalTemplateSource.js 以使用 Durandal 的 viewLocator 而不是使用注入器,现在我可以很好地使用剑道网格而没有任何问题(如上所述)。 ExternalTemplateSource.js 中的 getTemplate 函数现在如下所示:

getTemplate: function () 
  var self = this;
  viewLocater.locateView(self.templateId).then(function (element) 
    self.data("precompiled", null);
    var t = $(element).html();
    //system.log("got template: "+t );
    self.template(t);
    self.loaded = true;
  );

【讨论】:

我已经修改了 KoExternalTemplate 库中的 ExternalTemplateSource.js 以使用 Durandal 的 viewLocator 而不是使用注入器,现在我可以很好地使用剑道网格而没有任何问题(如上所述)。 ExternalTemplateSource.js 中的 getTemplate 函数如下所示

以上是关于如何将 Durandal#composition 集成到淘汰赛模板引擎中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用requirejs构建durandal应用程序?

如何开始使用带有 Durandal SPA 应用程序的 Phonegap Build?

Select2 Js 下拉菜单在 durandal Js 中不起作用

我该如何使用#!而不仅仅是在 Durandal URL 中的 #?

淘汰 Durandal 撰写视图 $root 访问权限

强制 Durandal 页面中的 Knockout 组件在绑定之前等待 Ajax 调用