【问题标题】:EmberJS - Template conditional with parameters [duplicate]EmberJS - 带有参数的模板条件[重复]
【发布时间】:2013-09-15 15:25:39
【问题描述】:

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

{{#each user in appModel.users}}

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

所以,

{{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}} helper 不能使用该方法的参数。

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

{{#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...
});

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

谢谢。

【问题讨论】:

    标签: templates ember.js helpers conditional


    【解决方案1】:

    编辑:从 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 实例属性,将为组中的每个用户显示一个块。

    【讨论】:

    【解决方案2】:

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

    {{#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/

    【讨论】:

    • 这个问题是你正在显示当前用户所属的组。我需要的是特定组中的用户列表(可能不是当前用户)。也许我原来的帖子不清楚;我会添加更多细节。
    • 查看我更新的帖子@MichaelBattaglia
    • 我成功了。您的帖子帮助我到达那里,但缺少一件事。您会看到,在您的小提琴中,您传递了组的实际名称,因此您只需查找名称即可在注册的助手中找到该组。我希望通过传递两个绑定属性来查找用户是否在一个组中,就像在我原来的帖子中我将 user.id 和 group.id 传递给 ifUserInGroup 一样。在你的小提琴中传递它会导致注册的助手将'user.id'和'group.id'用作字符串。关键是使用 Ember.Handlebars.get。我将在另一篇文章中展示我是如何做到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2015-08-04
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多