Emberjs带有把手的模板中的条件输出

时间:2013-08-26 11:50:02

标签: ember.js handlebars.js

我有以下型号:
具有名称,成员和版主的社区(均为用户)。具有id和名称的用户。

在CommunityMembers模板中,我想要显示所有用户,如果该用户是主持人,我想补充说他是主持人

<script type="text/x-handlebars" data-template-name="communityMembers">
  //model contains an array of users in a community
  {{#each user in model}}
    <li>{{user.name}}</li>
    {{#each moderator in controllers.community.moderators}}
      //here is the problem-->
      {{#if moderator.id == user.id}}
        <b>this is a moderator</b>
      {{/if}}
    {{/each}}
  {{/each}}
</script>

我知道在把手中你不能使用moderator.id == user.id但这是一个简单的方式来说出我想做的事。

我试着写一个把手助手,但是当我在帮助器中检查了我的参数是什么时,我得到一个字符串说:“moderator.id”或“user.id”,这样就没用了。

我也尝试使用我的社区对象中的方法:

App.Community = Ember.Object.extend({
  isModerator: function(community, user_id){
    return community.moderators.indexOf({"id":user_id})!=-1;
  }
});

在模板中:

{{#if isModerator(controllers.community,user.id)}}
      <h>this is a moderator</h>
{{/if}}

但是这给了我模板中的错误,如:

  

。编译器说:错误:第12行的解析错误:... / if}}   {{#if isModerator(controll
  ---------------------- ^期待'CLOSE','CLOSE_UNESCAPED','STRING','INTEGER','BOOLEAN','ID','DATA ','SEP','无效'

有谁知道如何处理这个问题?

2 个答案:

答案 0 :(得分:3)

你不能在Handlebars中做到这一点(如你所说),你不应该尝试用帮助器模仿这种行为。 此限制是故意设计到模板中的,因为在模板中包含太多逻辑被认为是一种不好的做法。相反,你的目标应该是编写这样的模板:

<script type="text/x-handlebars" data-template-name="communityMembers">
  //model contains an array of users in a community
  {{#each user in controller.usersWithModeratorFlag}}
    <li>{{user.name}}</li>
    {{#if user.isModerator}}
      <b>this is a moderator</b>
    {{/if}}
  {{/each}}
</script>

现在您可能会问自己如何实现此属性。您可以尝试这样的事情(如果您不能将此属性嵌入到您的用户对象中):

App.CommunityMembersController = Ember.ArrayController.extend({
  needs : ["community"],
  usersWithModeratorFlag : function(){
    var moderators = this.get("controllers.community.moderators");
    return this.get("model").map(function(user){
      if(moderators.contains(user)){
        user.set("isModerator", true);
      }
    } 
  }.property("model.@each", "controllers.community.moderators.@each")
});

正如您所看到的,将此逻辑移出模板并进入控制器非常容易。

答案 1 :(得分:0)

您可以使用ember-truth-helpers

{{#if (eq moderator.id user.id)}}
  <b>this is a moderator</b>
{{/if}}
相关问题