Javascript Ember.js为特定模型id添加css类
我正在开发聊天应用程序。我有组件室的模板Javascript Ember.js为特定模型id添加css类,javascript,html,css,ember.js,Javascript,Html,Css,Ember.js,我正在开发聊天应用程序。我有组件室的模板 <div class='border rooms'> <button class="add-room-container"> <div >Add room</div> </button> {{#each model as |room|}} <button class="room-container" {{acti
<div class='border rooms'>
<button class="add-room-container">
<div >Add room</div>
</button>
{{#each model as |room|}}
<button class="room-container"
{{action "onRoomClicked" room.id}}
{{bind-attr class="currentRoomId===room.id:currentRoom"}}>
<div class="deleteRoom" {{action "deleteRoom" room.id bubbles=false}}>
X
</div>
<div>{{room.name}}</div>
<div>{{room.createdAt}}</div>
</button>
{{/each}}
</div>
}
});
我对线路有问题
{{bind-attr class="currentRoomId===room.id:currentRoom"}}
我想检查当前按钮是否是最后一个被单击的按钮(在onRoomClicked中设置),如果是,则将currentRoom类添加到按钮
我试图设置动态属性,但我不知道如何从组件中访问当前模型(房间)id,然后像在模板中那样比较它。最简单的方法是使用,它为您提供了模板中非常有用的
eq
帮助器。然后你可以写:
{{#each model as |room|}}
<button
class="room-container {{if (eq room.id currentRoomId) "currentRoom"}}"
{{action "onRoomClicked" room.id}}>
</button>
{{/each}}
{{{#每个模型作为|房间}
{{/每个}}
这是在类属性中使用嵌入的
if
帮助程序,而不是bind attr
()。最简单的方法是使用,它在模板中为您提供了非常有用的eq
帮助程序。然后你可以写:
{{#each model as |room|}}
<button
class="room-container {{if (eq room.id currentRoomId) "currentRoom"}}"
{{action "onRoomClicked" room.id}}>
</button>
{{/each}}
{{{#每个模型作为|房间}
{{/每个}}
这是在类属性中使用嵌入的
if
helper,而不是bind attr
()。您有许多不同的方法来实现这一点。但首先,问题是您使用的是什么版本的余烬。在当前的余烬版本中,bind attr
不应再使用
首先,我假设您这样调用组件:
{{my-component model=rooms}}
我强烈建议不要调用您的数据模型
!给他们一个会说话的名字。做一些类似于rooms=rooms
的事情
现在您已经在组件中了。您可能发现问题在于{{{each}}
循环,这导致{{{each}}
循环中没有.js
文件作为上下文
最好的解决方法是使用第二个组件,在每个循环中调用:
{{#each model as |room|}}
{{room-line room=room currentRoomId=currentRoomId}}
{{/each}}
然后你可以把你的{{{{each}}
身体放在你的房间里。hbs
:
<button class={{if isCurrentRoom "currentRoom"}}>
....
另一种处理方法是将
isCurrentRoom
注入您的room
。这可以通过.map()
或ArrayProxy
和/或ObjectProxy
完成
在组件.js
文件中类似这样的内容:
calculatedRooms: Ember.computed('rooms.@each.id', 'currentRoomId', {
get() {
return get(this, 'rooms').map(room => ({
room,
isCurrentRoom:get(room, 'id') === get(this, 'currentRoomId')
}));
}
}),
然后您可以在{{{each}
帮助程序中使用它:
{{#each calculatedRooms as |line|}}
<button class="room-container {{if line.isCurrentRoom 'currentRoom'}}"
{{action "onRoomClicked" line.room.id}}>
...
{{/each}}
然后您可以在模板中使用它:
{{#each calculatedRooms as |room|}}
<button class="room-container {{if (is-equal currentRoomId room.id) 'currentRoom'}}"
{{action "onRoomClicked" room.id}}>
...
{{/each}}
{{{#每个房间都计算为|房间}
...
{{/每个}}
如果您选择这种方法,您可以使用它来提供帮助,但您也可以自己编写
我强烈推荐第一种方法,这是处理这个问题最优雅的方法。你有很多不同的方法。但首先,问题是您使用的是什么版本的余烬。在当前的余烬版本中,
bind attr
不应再使用
首先,我假设您这样调用组件:
{{my-component model=rooms}}
我强烈建议不要调用您的数据模型
!给他们一个会说话的名字。做一些类似于rooms=rooms
的事情
现在您已经在组件中了。您可能发现问题在于{{{each}}
循环,这导致{{{each}}
循环中没有.js
文件作为上下文
最好的解决方法是使用第二个组件,在每个循环中调用:
{{#each model as |room|}}
{{room-line room=room currentRoomId=currentRoomId}}
{{/each}}
然后你可以把你的{{{{each}}
身体放在你的房间里。hbs
:
<button class={{if isCurrentRoom "currentRoom"}}>
....
另一种处理方法是将
isCurrentRoom
注入您的room
。这可以通过.map()
或ArrayProxy
和/或ObjectProxy
完成
在组件.js
文件中类似这样的内容:
calculatedRooms: Ember.computed('rooms.@each.id', 'currentRoomId', {
get() {
return get(this, 'rooms').map(room => ({
room,
isCurrentRoom:get(room, 'id') === get(this, 'currentRoomId')
}));
}
}),
然后您可以在{{{each}
帮助程序中使用它:
{{#each calculatedRooms as |line|}}
<button class="room-container {{if line.isCurrentRoom 'currentRoom'}}"
{{action "onRoomClicked" line.room.id}}>
...
{{/each}}
然后您可以在模板中使用它:
{{#each calculatedRooms as |room|}}
<button class="room-container {{if (is-equal currentRoomId room.id) 'currentRoom'}}"
{{action "onRoomClicked" room.id}}>
...
{{/each}}
{{{#每个房间都计算为|房间}
...
{{/每个}}
如果您选择这种方法,您可以使用它来提供帮助,但您也可以自己编写
我强烈推荐第一种方法,这是处理这个问题最优雅的方法。我也有同样的答案。不过这一条解释得更清楚一些,我也有同样的答案。不过,这一点更具解释性。