0

items如果路线中的项目使用组件event-item来显示每个项目,我有一个列表。这个组件上有两个计算的,现在正在设置一些类来向用户显示关于每个项目的一些信息......

classNameBindings: ['winning','closed'],
item: null,
winning: Ember.computed('item.item_high_bid_user_id','userService.user_id',function(){
    return this.get('item.item_high_bid_user_id') == this.get('userService.user_id');
}),
closed: Ember.computed('item.item_status',function(){
    return this.get('item.item_status') === 2;
})

在组件模板中,列表中的每个项目都包含在一个link-to链接到item路由的链接中,该路由显示单个项目。

item模板甚至路线中,我想观察相应组件上的winning和计算的,以显示或隐藏模板中的某些内容(即,如果项目关闭,则隐藏投标部分等)closeditem

这样做的正确方法是什么?

顺便说一句,我正在使用 Ember 2.2.0Ember Data2.2.0和 Ember-cli1.13.13

4

1 回答 1

0

如果您的event-item组件链接到item路由,我假设您将项目模型传递给帮助程序,这意味着计算这些属性所需的所有属性在控制器link-to中仍然可用。item

// templates/whichever-template-holds-items.hbs
{{#each items as |item|}}
  {{event-item model=item}}
{{/each}}


// templates/components/event-item.hbs
<div>
  {{link-to 'item' model}} // pass model to item route
</div>


// controllers/item.js
import Ember from 'ember';

export default Ember.Controller.extend({
  // include userService

  winning: Ember.computed.equal('model.item_high_bid_user_id','userService.user_id'),
  closed: Ember.computed.equal('model.item_status', 2)
});


// templates/item.hbs
{{#if winning}}
  // show winning stuff
{{/if}}

{{#if closed}}
  // show closed stuff
{{/if}}

另外,我注意到您在发布的代码中混合了条件=====条件。大多数时候你会想要使用 ===,请看这篇文章

差点忘了 - Ember.computed.equal


更新(回应您下面的评论)

有几种方法可以提醒控制器组件中的值已更改,但在您当前的情况下,这两种方法都不是真正有用的。

第一种方法(可以这样做)是遵循 DDAU(数据向下,动作向上)并将一个动作从您的组件发送到您的控制器,但这仅在组件位于控制器的视图内时才有效,这不是你正在做的事情的情况。

第二种方式(这不是真正理想的 IMO)是以 pub/sub 方式使用服务,这将允许远程组件/控制器相互交谈(您可以在此处阅读有关此方法的更多信息)。就以这种方式做事而言,您可能会得到不同的反应,因为它可能会破坏您应用程序的数据流。但有时你的选择是有限的。

综上所述,我可能会坚持在控制器中重新计算,而不是尝试通过您的应用程序将数据从一个控制器发送到另一个控制器。最后,它仍然会更少的代码和更少的框架工作。希望这会有所帮助。

于 2015-12-02T00:24:43.133 回答