2013-08-26 32 views
1

我得到以下模型:
一个名称,成员和版主(都是用户)的社区。拥有ID和名字的用户。Emberjs在带把手的模板中的条件输出

在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> 

我知道,在车把上,你可以” t使用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}} 

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

. Compiler said: Error: Parse error on line 12: .../if}}
{{#if isModerator(controll
----------------------^ Expecting 'CLOSE', 'CLOSE_UNESCAPED', 'STRING', 'INTEGER', 'BOOLEAN', 'ID', 'DATA', 'SEP', got 'INVALID'

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

回答

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("[email protected]", "[email protected]") 
}); 

正如你所看到的,这是很容易移动这样的逻辑出了模板和到控制器,它属于哪里。