javascript - Ember.js 为特定模型 ID 添加 css 类

标签 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" 
             {{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>

和组件js文件 从“ Ember ”导入 Ember ;

export default Ember.Component.extend({
  actions: {
    onRoomClicked(roomId) {
      this.set('currentRoomId', roomId);
    },
    deleteRoom(room) {
      console.log('room removed');
    }

} });

我的线路有问题

{{bind-attr class="currentRoomId===room.id:currentRoom"}}

我想检查当前按钮是否是最后一个被点击的按钮(它在 onRoomClicked 中设置),如果是则将 currentRoom 类添加到按钮

我试图设置动态属性,但我不知道如何从组件访问当前模型(房间)id,然后像在模板中那样比较它

最佳答案

你有很多不同的方法来做到这一点。但首先问题是您使用的是什么 ember 版本。在当前的 ember 版本中,不应再使用 bind-attr!

所以首先我假设你这样调用你的组件:

{{my-component model=rooms}}

我强烈建议不要调用您的数据 model!给他们一个会说话的名字。做类似 rooms=rooms 的事情!

所以现在你在你的组件中。您可能发现问题是您的 {{#each}} 循环,这导致您没有 .js 文件用于{{#each}} 循环。


可能最好的解决方法是使用第二个组件,您可以在每个循环中调用它:

{{#each model as |room|}}
  {{room-line room=room currentRoomId=currentRoomId}}
{{/each}}

然后你可以将你的{{#each}} body 放在你的room-line.hbs 中:

<button class={{if isCurrentRoom "currentRoom"}}>
....

并且您有一个后备 room-line.js,您可以在其中计算 isCurrentRoom:

isCurrentRoom: Ember.computed('currentRoomId', 'room.id', {
  get() {
    return get(this, 'currentRoomId')===get(this, 'room.id');
  }
})

另一种处理方法是将 isCurrentRoom 注入(inject)到您的 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}}

第三种方法是为此使用自定义助手。这可能是最简单的方法,但也可能是最丑陋的方法,因为您将逻辑放在模板中。

一个简单的 is-equal 助手可以帮助您:

export function isEqual(a, b) {
  return a === b;
}

export default Ember.Helper.helper(=);

然后你就可以在你的模板中使用它了:

{{#each calculatedRooms as |room|}}
   <button class="room-container {{if (is-equal currentRoomId room.id) 'currentRoom'}}" 
     {{action "onRoomClicked" room.id}}>
    ...
{{/each}}

如果您选择此方法,您可以使用 ember-truth-helper它提供了该帮助器,但您也可以自己编写。


我强烈推荐第一种方法,这是处理此问题的最优雅的方法。

关于javascript - Ember.js 为特定模型 ID 添加 css 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36677963/

相关文章:

javascript - 无法识别触发 "maximum call stack size exceeded"错误的递归

javascript - onclick 属性不适用于 flexbox

jquery - 在 jQuery 函数中选择类 a :active span vs. a.active 跨度?

html - 网店导航问题

javascript - jQuery 在保持高度和隐藏之前的文本的同时追加文本

html - 如何在 Jade 中更改页面的背景颜色?

javascript - 从输出文件中删除 Webpack Bootstrap

javascript - 如何打开具有特定 ID 或类的 colorbox?

javascript - 如何在 JavaScript 中迭代 JSON 对象并用它创建表?

html - 垂直分页和列