我需要从两个数组中生成一个随机字符串,其中包含一组人员和设备的名称。我有一个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}}
答案 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}}
循环,您仍然在同一个组件中,那么您希望在哪里声明应该为数组中的每个实例运行的属性?这就是为什么你需要另一个组件。另一个选择是拥有一个计算属性,它为您提供了一个新的不同数组,以及所有必需的数据。