EmberJS - 带参数的条件模板

时间:2013-09-15 15:25:40

标签: templates ember.js helpers conditional

在我的模板中,我正在遍历模型中的数组。 为简单起见,我将使用以下示例:

{{#each user in appModel.users}}

现在,如果用户在某个组中,我正在尝试显示user的元素。 我有App.Group作为模型,它有一个检查用户是否在组中的方法。此方法采用参数user。

所以,

{{group.has_user user}}

如果groupApp.Group的特定实例,如果在组的ID列表中找到用户的ID,则返回true或false。

我试图找到一种方法将此方法用作模板条件。像这样:

{{#if group.has_user user}}
  <block>
{{/if}}

把它们放在一起:

{{#each user in appModel.users}}
  {{#if group.has_user user}}
    <block displaying user data>
  {{/if}}
{{/each}}

因此,将实现显示该组用户的期望效果。问题是条件{{#if}}帮助器不能使用该方法获取参数。

我尝试使用自定义寄存器助手,但我找不到传递模型属性的方法。如果我在模板中使用了这样的帮助:

{{#ifUserInGroup user.id group.id}}

我会将字符串'user.id'和'group.id'作为传递的参数。助手的写法如下:

Ember.Handlebars.registerHelper('ifUserInGroup', function(val1, val2, options){
   //This is where I would get the models, but val1 and val2 are strings, not id's...
});

如果有人知道在条件中使用该方法的方法,或者如何将实际值传递给帮助者,请帮助我。

谢谢。

2 个答案:

答案 0 :(得分:6)

编辑:从ember版本1.0开始,此解决方案不再有效。

在我的原始职位上建立我的注册助手,并在Vinothbabu的帮助下,我设法让一些工作。

我缺少的是Ember.Handlebars.get(root, path, options)

Ember.Handlebars.registerHelper('ifUserInGroup', function(user, group, options){
    user = Ember.Handlebars.get(this, user, options);
    group = Ember.Handlebars.get(this, group, options); 
    if (group.has_user(user)) {
        return options.fn(this);
    } else {
        return options.inverse(this);
    }
});

使用该函数,我可以获得实际的绑定数据,而不是传递给帮助程序的字符串。

所以,

{{#each user in users}}
  {{#ifUserInGroup user.id some_group.id}}
    <block displaying user data>
  {{/ifUserInGroup}}
{{/each}}

其中users是应用模型的数组属性,而some_group是应用模型的App.Group实例属性,会为该组中的每个用户显示一个块

答案 1 :(得分:-1)

尝试下面的代码,让我知道它是否有效。

{{#each group in model}}
   {{#if group.has_user}}
      <block>
   {{/if}}
{{else}]
    <block>
{{/each}}

然后在模型类中,检索这样的数据。

App.YourModelClass = Ember.Model.extend({
     has_user:function(){
        var value = this.get('user');
     }
});

您还可以使用valueBinding属性将属性绑定到模型类,如下所示。

{{view Ember.TextField valueBinding="yourProp"}}

按要求更新

以下是模板更改...

 {{#ifUserInGroup user group}}
    yes
   {{else}}
    no
 {{/ifUserInGroup}}

以下是您的车把帮助。

Handlebars.registerHelper('ifUserInGroup', function (user, group, options) {
    if (typeof group[user] != 'undefined') {
        return options.fn(this);
    } else {
        return options.inverse(this);
    }
});

以下是小提琴http://jsfiddle.net/R8u6g/12/