【问题标题】:External templates and "el" with Knockout and RequireJS?带有 Knockout 和 RequireJS 的外部模板和“el”?
【发布时间】:2013-03-05 04:16:10
【问题描述】:

我正在尝试将 Knockout ViewModels 用作可以放置到页面上任何(或多个)DOM 节点中的独立“小部件”。我在 Backbone 中有一种方法似乎效果很好,我正在尝试将这个概念转换为 Knockout。

在 Backbone 视图中,我会做这样的事情,使用 RequireJS 文本插件来提取模板并将其注入到 el 中:

define(['text!templates/myTemplate.html',], function(templateHTML){
    var view = Backbone.View.extend({

        initialize:function() {
            // yes I know the underscore templating stuff doesn't apply in Knockout
            this.template = _.template( templateHTML );
            this.render();
        },

        render:function( ) {
            // the $el is provided by external code. See next snippet
            this.$el.append(this.template(myData));
            return this;
        }

        // other view behavior here

    });

    return view;
});

然后其他一些外部代码可以将该视图放入现有的 DOM 节点中:

new MyBackboneView({el: $('#myExistingDivID')});

在 Knockout 中,我能找到的最接近这种方法的方法是让 外部代码 使用 Text 插件拉取模板,将其注入 div,然后应用 KO 绑定:

var mydiv = $('#myExistingDivID');
mydiv.html(myTemplateHTML);
ko.applyBindings(new MyKOViewModel(), mydiv[0]);

1 - 在 Knockout 中是否有推荐的方法让 ViewModel 本身基于 Backbone 的“el”概念注入外部模板 HTML?关键是外部(路由器式)代码控制将放置内容的位置,但 ViewModel 控制内容的实际细节以及从何处获取模板。

2 - 如果是,应该我采用这种方法,还是我滥用了 Knockout 和 MVVM 的预期使用方式?

【问题讨论】:

  • 我不是淘汰专家,但我相信您对第 2 点的看法是正确的。淘汰中的视图是 html 代码,通常从服务器返回,内部带有 data-binding 属性。它不像 Backbone.View 那样从模板创建。

标签: javascript backbone.js knockout.js requirejs


【解决方案1】:

您可以覆盖默认模板源,然后将其与默认渲染引擎一起使用,例如

var stringTemplateEngine = new ko.nativeTemplateEngine();
stringTemplateEngine.makeTemplateSource = function (template) {
    return new StringTemplateSource(template);
};
ko.setTemplateEngine(stringTemplateEngine);

我做的简单例子

http://jsfiddle.net/3CQGT/

【讨论】:

  • 如果我正确理解了您的示例,外部代码仍在提供模板(就像我的示例一样)。相反,我试图让 ViewModel 本身提供模板并将其注入外部代码提供的位置(例如,除了 id 没有其他标记的空 div)。再次,类似小部件的方法。如果我误解了你的例子,请告诉我。
  • 如果您将我的上述解决方案与我的 Convention over configuration 库相结合,您将获得一个真正干净的解决方案,您可以在其中抽象视图模型和视图。看这里github.com/AndersMalmgren/Knockout.BindingConventions/wiki/…
猜你喜欢
  • 2016-04-29
  • 2018-01-21
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多