【问题标题】:Ember 2.3 how to use itemControllers in each loops?Ember 2.3 如何在每个循环中使用 itemControllers?
【发布时间】:2016-02-04 21:02:48
【问题描述】:

在任何人提出组件之前,我必须声明我知道 Ember 正在完全摆脱控制器和视图并采用组件结构。现在,我不得不使用此处提供的 legacy-controller 和 legacy-view 插件在 ember2.3 中使用控制器/视图:

https://github.com/emberjs/ember-legacy-controllers

https://github.com/emberjs/ember-legacy-views

作为升级到 Ember 2.3(从 1.7)过程的一部分。

现在,我有一个名为 recordTypes 的路由,它列出了所有的 recordType。在遗留代码中,每个 recordType 然后与 itemController 'recordType' 相关联。像这样:

{{#each result in searchResults itemController="recordType"}}
...
{{/each}}

令人惊讶的是,Ember 的这种旧式语法并没有向页面呈现任何内容,但下面的语法却做到了:

{{#each searchResults itemController="recordType" as |result| }}
 ...
{{/each}}

itemController recordType 是一个旧的对象控制器,而 recordTypes 控制器本身是一个旧的数组控制器。

现在,对于每个结果,我都有一些可以执行的操作。例如,单击结果时,将触发 editResultName 操作。此操作在旧代码中位于 recordType 控制器中。因此,单击 recordTypes 页面中的项目会将此操作推迟到 recordType 控制器,然后愉快地处理剩下的。

这不会在 ember2.3 中触发,即使使用旧版控制器也是如此。更让我惊讶的是,这段代码可以在 ember-legacy-controller.js 中找到

export default {
  name: 'ember-legacy-controllers',
  initialize: function() {
    /**
      Adds support for ArrayController in the legacy {{each}} helper
    */
    Ember._LegacyEachView.reopen({
      _arrayController: computed(function() {
        var itemController = this.getAttr('itemController');
        var controller = get(this, 'container').lookupFactory('controller:array').create({
          _isVirtual: true,
          parentController: get(this, 'controller'),
          itemController: itemController,
          target: get(this, 'controller'),
          _eachView: this,
          content: this.getAttr('content')
        });

        return controller;
      }),

      _willUpdate(attrs) {
        let itemController = this.getAttrFor(attrs, 'itemController');

        if (itemController) {
          let arrayController = get(this, '_arrayController');
          set(arrayController, 'content', this.getAttrFor(attrs, 'content'));
        }
      }
    });

  }
};

在这里,它确实有一行引用了 itemController。但是,当呈现此 searchResults 列表并单击 result 时,我得到的错误是:

 Nothing handled the action 'editResultName'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

该动作确实存在,但 itemController 中的任何内容都没有被识别。不幸的是,我正在更新的许多遗留代码都有 itemController 循环,因此暂时能够使用 itemController 将非常有帮助。

我怎样才能像以前那样使用 itemController?

【问题讨论】:

  • 先升级到最新的 Ember 1.13 比直接升级到 Ember 2.3 可能非常有帮助

标签: ember.js ember-cli


【解决方案1】:

替换一个 itemController。

each 助手中的内容创建一个组件。 itemController 将成为组件的js 侧,模板代码为template

从这里:

{{#each result in searchResults itemController="recordType"}}
  <span>result: {{result.title}}</span>
{{/each}}

对此:

{{#each searchResults as |result| }}
  {{result-list-item result=result}}
{{/each}}

【讨论】:

  • 如果您想了解更多详情,请告诉我
  • 我的朋友,我正要说我将在未来阶段考虑组件,但让我震惊的是,您所布置的内容可以用来完美地模拟 itemController。我创建了一个组件(result-list-item),将 itemController 中的所有代码放入其中,并将结果作为模型传递,它运行良好。当然有一些问题和一些渲染问题需要解决,虽然这不是我正在寻找的答案,但这绝对是解决我的问题的实现。谢谢。
  • 非常高兴能提供帮助
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2017-02-08
相关资源
最近更新 更多