代码之家  ›  专栏  ›  技术社区  ›  mpj

Ember.js助手内的动态内容

  •  2
  • mpj  · 技术社区  · 12 年前

    我有一个模板,它的视图中有很多属性。对于所有这些属性,我需要检查它们是否为空,并显示它们:

    ...
    <div {{bind-attr class=":(foo-class) view.foo::hidden"}}>{{view.foo}}</div>
    <div {{bind-attr class=":(bar-class) view.bar::hidden"}}>{{view.bar}}</div>
    ...
    

    为了使模板不那么冗长,我想创建一个助手,比如 displayAttribute ,它采用参数的名称并返回正确的HTML内容。

    然而,我不知道如何构建字符串以使其在帮助器内部以绑定工作的方式返回。

    Ember.Handlebars.helper('displayAttribute', function(attr, tag) {
        if (typeof(tag) === 'undefined') {
          tag = 'div';
        }
    
        // TODO: generate output string
    
        return new Handlebars.SafeString(output);
    });
    

    我该如何继续?

    1 回复  |  直到 12 年前
        1
  •  3
  •   thecodejack    12 年前

    为了使绑定工作,需要使用 Ember.Handlebars.registerBoundHelper

    Ember.Handlebars.registerBoundHelper('displayAttribute', function(value,options) {
        if (typeof(tag) === 'undefined') {
          tag = 'div';
        }
    
        // TODO: generate output string
    
        return new Handlebars.SafeString(output);
    }, dependentKeys);
    

    注意,它需要3个参数。

    @param {String} name
    @param {Function} function
    @param {String} dependentKeys*
    

    对于更多的文档,我建议通过以下链接。

    Ember API Docs
    Ember Source Code

    以下是代码文档中的内容

    选项示例

    像普通的把手助手一样,绑定助手可以访问选项 传入助手调用。

    Ember.Handlebars.registerBoundHelper('repeat', function(value, options) {
        var count = options.hash.count;
        var a = [];
        while(a.length < count) {
            a.push(value);
        }
        return a.join('');
      });
    

    此助手可以在模板中使用,如下所示:

      {{repeat text count=3}}
    

    ##带有绑定选项的示例

    还支持绑定哈希选项。例子:

    {{repeat text countBinding="numRepeats"}}
    

    在此示例中,count将绑定到 这个 numRepeats 属性。如果该属性 更改时,将重新渲染助手。

    ##具有额外依赖项的示例

    这个 Ember.Handlebars.registerBoundHelper 方法采用可变长度 第三个参数,指示对传入值的额外依赖性。 这允许把手助手在这些依赖项更改时进行更新。

      Ember.Handlebars.registerBoundHelper('capitalizeName', function(value) {
        return value.get('name').toUpperCase();
      }, 'name');
    

    ##具有多个绑定财产的示例

    Ember.Handlebars.registerBoundHelper 支持绑定到 多个财产,例如:

    Ember.Handlebars.registerBoundHelper('concatenate', function() {
        var values = Array.prototype.slice.call(arguments, 0, -1);
        return values.join('||');
      });
    

    它允许模板语法,例如 {{concatenate prop1 prop2}} 或 {{concatenate prop1 prop2 prop3}} 。如果任何财产发生变化, 帮助者将重新渲染。请注意,依赖项键不能 与多属性助手一起使用,因为它不明确 从属密钥将属于哪个属性。

    这是 working jsbin 作为一个例子