如何在运行不止一次的Ember组件模板中使用变量?

时间:2017-05-04 18:22:58

标签: ember.js

我需要从两个数组中生成一个随机字符串,其中包含一组人员和设备的名称。我有一个Ember计算属性,可以很好地完成它。计算属性除外只发生一次。所以我最终得到了一个包含相同文本的5行的列表。

我这样做的原因是因为我从REST Web服务获取设备列表,但他们无法返回设备名称,只返回id和一堆其他信息。所以我现在应该使用虚拟名称,所以我想。没问题。我只会为每一行生成一个随机名称。正如我已经说过的那样,我最终得到了这个:

property1: function() {
  bunch of code
}.property('property2');

当它需要是随机人员和随机设备的名称时(我在数组中有代码并且代码完美运行,但只执行一次,并且每次连续调用它都会返回相同的值。

然后我在这里阅读,在Ember书中我必须这样做:

{{#each}}

所以这应该在每次property2更改时运行,除了。回到原点。我该如何更改property2?我无法从hbs模板,text helper response remaining text 中的代码中执行此操作。然后,我在某处阅读使用自定义帮助程序,但根据我的经验,任何帮助程序都会在div中对封装布局中的返回值进行封装处理并将导致

text helper response remaining text

当我想要的是:

The answer is {{answer-helper}}.

我的意思是,我可以创建一个文本数组,然后传递索引,但是当我添加新数据时,我必须手动将项添加到数组中,因为它不是为每一行数据动态生成的。

使用我的方法,我喜欢随机选择大量的名称和设备名称,因此无论返回多少数据,它都可以填充名称字段,直到它们在后端修复它以返回名称。

真的很想知道如何解决这个问题,但是如何在页面/模板/等中运行我想要的任何代码。不只是静态属性或计算一次属性..

有时你希望能够拥有使用完全动态的变量的模板,每次调用该组件都会运行。

有时你想要一个没有在div中封装响应的实际帮助器,所以你可以做The answer is 5 . 之类的东西而不输出这个:

{{1}}

1 个答案:

答案 0 :(得分:1)

好的,如果您不想输出数据,首先会有helpers。帮助器封装div中的任何内容。并且帮助程序不是组件。组件通常会生成div。但是,如果您想要一个不会产生div的组件,您只需将tagName设置为''

那就是你应该做的:使用两个组件:

设备列表/ template.hbs

{{#each devices as |device|}}
  {{device-data device=device}}
{{/each}}

设备项/ template.hbs

{{myprop}}

设备项/ component.js

import Ember from 'ember';

export default Ember.Component.extend({
  tagName: '',
  myprop: Ember.computed('device.foo', {
    get() {
      return this.get('device.foo') + 'bla';
    }
  }),
});

现在,对于数组中的每个项目,您都拥有属性myprop

另一种选择是将数组作为计算属性:

devicesWithNames: Ember.computed('devices.@each.foo', {
  get() {
    return this.get('devices').map(device => ({
      foo: device.foo,
      name: device.foo + 'bla', // anything you want to do
    }));
  }
}),

解决问题的另一种方法是ArrayProxy

  

真的很想知道如何解决这个问题,但是如何在页面/模板/等中运行我想要的任何代码。不只是静态属性或计算一次属性..

你不能,那很好。这迫使您遵循清洁标准。例如,您无法从模板中调用组件上的代码。您可以调用帮助程序,也可以使用模板提供的数据。但这是一个单向数据流,这有助于理解组件的工作原理。如果你需要这样做,请使用一个计算属性,如果你需要在{{#each}}循环内部写一个要在循环中使用的另一个组件。

  

有时你希望能够拥有使用完全动态的变量的模板,每次调用该组件都会运行。

似乎你不明白这一点。但这可以按预期工作。被调用两次的组件将计算两次所有属性。但是,您需要了解如果使用{{#each}}循环,您仍然在同一个组件中,那么您希望在哪里声明应该为数组中的每个实例运行的属性?这就是为什么你需要另一个组件。另一个选择是拥有一个计算属性,它为您提供了一个新的不同数组,以及所有必需的数据。

相关问题