余烬CLI-在每个循环中使用组件而不是itemController的条件输出

Ember CLI- conditional output within an each loop using a component instead of itemController

本文关键字:itemController 输出 条件 组件 CLI- 循环 余烬      更新时间:2023-09-26

在我的Ember CLI应用程序中,我使用{{#each}} helper来输出表的行。'name' 'created_date'和'type'都在相关模型中定义。

{{#each model as |job|}}
<tr>
  <td>{{job.name}}</td>
  <td>{{job.created_date}}</td>
  <td>{{job.type}}</td>
  <td>
  {{#if typeZero}}
     <p>Content that will display if the value of 'type' is 0.</p>
  {{/if}}
  </td>
</tr>
{{/each}}

在每行的第四个表单元格中,如果记录的'type'值为0,我希望显示某些内容。

我首先尝试添加一个itemController到每个助手:

{{#each job in model itemController="jobrowcontroller"}}
......
{{/each}}

这给了我一个错误:"Uncaught error: Assertion Failed: #each循环遍历的值必须是Array。你传递了***@controller:array:,但它应该是一个ArrayController"

我发现itemController现在已经被弃用了,应该使用组件。

创建了一个名为job-table-row的组件,并更新了页面模板:

  {{#each model as |job|}}
   {{#job-table-row model=job as |jobTableRow|}}
    <tr>
      <td>{{job.name}}</td>
      <td>{{job.created_date}}</td>
      <td>{{job.type}}</td>
      <td>
      {{#if typeZero}}
        <p>Content that will display if the value of 'type' is 0.</p>
      {{/if}}
      </td>
    </tr>
   {{/job-table-row}}
  {{/each}}

在组件handlebars文件中,我简单地使用{{yield}},一切都显示良好。

在组件js文件中,我有:

import Ember from 'ember';
export default Ember.Component.extend({
  tagName: '',
  typeZero: function() {
    var currentStatus = this.get('model.status');
    if (currentStatus === 0) {
      this.set('typeZero', true);
    } else this.set('typeZero', false);
  }.on('didInsertElement'),
});

问题是函数'typeZero'不会运行。是否有可能通过组件实现这一点,或者我是否需要使用完全不同的方法?

不能让步,因为typeZero只存在于组件内部。相反,将模板移动到组件:

// templates/components/job-table-row.hbs
<td>{{model.name}}</td>
<td>{{model.created_date}}</td>
<td>{{model.type}}</td>
<td>
  {{#if statusZero}}
    <p>Content that will display if the value of 'status' is 0.</p>
  {{/if}}
</td>

和简化你的模板外面:

<table>
  <tbody>
    {{#each model as |job|}}
      {{job-table-row model=job}}
    {{/each}}
  </tbody>
</table>

同样,你可以用计算属性代替你的复杂方法:

// components/job-table-row.js
import Ember from 'ember';
export default Ember.Component.extend({
  tagName: 'tr',
  statusZero: Ember.computed.equal('model.status', 0)
});

在http://ember-twiddle.com/de8a41b497ef4f116bab查看所有工作