【问题标题】:Dynamically compile a HTMLBars template at runtime in Ember在 Ember 中运行时动态编译 HTMLBars 模板
【发布时间】:2016-09-17 15:00:08
【问题描述】:

我想在 Ember 的客户端上在运行时动态编译(然后渲染)一个 HTMLBars 模板。我该怎么做?

【问题讨论】:

    标签: templates ember.js compilation htmlbars


    【解决方案1】:

    这个答案现在已经过时了。请参阅我在上面接受的@poohoka 的回答。


    以 Kingpin2K 对Compile template client side in ember using HTMLbars 的回答为基础:

    对于一些背景知识,参考Compiling Templates with Ember 1.10 可能会很有用。我们仍然需要加载ember-template-compiler.js。添加

      app.import('bower_components/ember/ember-template-compiler.js');
    

    致您的ember-cli-build.js

    然后你可以这样写一个组件:

    import Ember from 'ember';
    
    export default Ember.Component.extend({
    
      layout: Ember.computed(function() {
        return Ember.HTMLBars.compile(
          '{{foo-bar}} <span>' + 'hello' + '</span>'
        );
      }),
    
    });
    

    此解决方案可能会在未来的 Ember 版本中中断,具体取决于 Ember 模板编译过程随着 Glimmer 2 的出现而发生的变化。

    【讨论】:

      【解决方案2】:

      从 Ember 2.13+(默认没有 bower)开始,您需要在 ember-cli-build.js 中添加:

      app.import('vendor/ember/ember-template-compiler.js');
      

      对于 2.10 之前的 Ember 版本,您需要通过 bower 包含它(也在 ember-cli-build.js 上)

      app.import('bower_components/ember/ember-template-compiler.js');
      

      在你需要的代码上:

      Ember.TEMPLATES['mycompiledcode'] = Ember.HTMLBars.compile('{{foo-bar}} <span>' + 'hello' + '</span>');
      

      在hbs文件中调用:

      {{partial 'mycompiledcode'}}
      

      或者你可以像这样制作一个组件:

      import Ember from 'ember';
      
      export default Ember.Component.extend({
      
        layout: Ember.computed(function() {
          return Ember.HTMLBars.compile(
            '{{foo-bar}} <span>' + 'hello' + '</span>'
          );
        }),
      
      });
      

      基于另一个答案https://stackoverflow.com/a/37345099/6505594的解决方案

      【讨论】:

        【解决方案3】:

        由于 Ember 2.10 现在使用 Glimmer,这里的事情可能有点棘手。为了编译模板,您需要将ember-template-compiler.js 包含到您的应用程序中。我建议使用ember-browserifyember-source

        在你的控制器中,如下导入编译器。

        import Ember from 'ember';
        import Compiler from 'npm:ember-source/dist/ember-template-compiler';
        
        export default Ember.Controller.extend({
          compileContent() {
            const template = Compiler.compile(this.get('dynamicContent'));
            Ember.TEMPLATES[`YOUR_TEMPLATE_NAME`] = template;
          },
          // we observe content changes here
          contentDidUpdate: Ember.observer('dynamicContent', function() {
            this.compileContent();
          }),
        });
        

        经过测试,您的内容可以包含从 Ember 帮助程序到您的自定义组件的任何内容,甚至是您的操作绑定。

        例如

        <ul>
          <li>{{#link-to 'index'}}Home{{/link-to}}</li>
        </ul>
        <div {{action 'yourCustomAction'}}>
          {{your-custom-component params=yourCustomParams model=model flag=true}}
        </div>
        

        现在,让我们使用 {{partial}} 助手在您的模板中施展魔法。

        ...
        
        {{partial 'YOUR_TEMPLATE_NAME'}}
        
        ...
        

        此方法在 Ember 2.13 中有效,没有弃用警告,它应该在未来的更新中有效。请注意,Ember.TEMPLATES 是全局变量,引擎似乎以某种方式对其进行了缓存,因此不要将新值重新分配给现有变量。

        【讨论】:

          【解决方案4】:

          我目前使用的是 Ember-2.9.x,我用我的bower.json 带来了最新的车把:

          "handlebars": "^4.0.0"
          

          然后通过我的ember-cli-build.js 文件添加它:

          app.import('bower_components/handlebars/handlebars.js');
          

          这适用于我的 typeahead 组件,我看不出有任何理由说明为什么在使用 Glimmer2 升级到 Ember-2.10 时这不起作用。

          【讨论】:

            猜你喜欢
            • 2015-07-30
            • 2014-07-01
            • 2015-06-06
            • 1970-01-01
            • 2016-11-09
            • 2015-06-05
            • 1970-01-01
            • 2014-10-01
            • 2017-01-16
            相关资源
            最近更新 更多