我是ember的新手,我想在我的一个动作(分配)中使用单独的动作(显示为随机播放)。我知道我在这里做错了什么,洗牌方法并没有真正做任何事情。我是不正确地调用它还是其他操作不应该使用的操作?这是代码:
import Ember from 'ember';
export default Ember.Controller.extend({
taskData: [],
personData: [],
taskIn: ' ',
personIn: ' ',
actions: {
saveTask() {
const task = this.get("taskIn");
this.taskData.push(task);
},
savePerson()
{
const person = this.get("personIn");
this.personData.push(person);
},
print(){
var taskString;
//this.taskData.remove(0);
for(var i = 0; i < this.taskData.length; i++)
{
taskString = taskString + this.taskData[i];
}
alert(taskString);
//alert(this.personData);
},
shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
},
//algorithm to match up tasks with people
assign(){
var newTaskD = this.shuffle(this.taskData);
var newPersonD = this.shuffle(this.personData);
var taskString = '';
var peopleString = '';
for(var i = 0; i<newTaskD.length; i++)
{
taskString += " " + newTaskD[i];
}
for(var j = 0; j<peopleString.length; j++)
{
peopleString += " " + newPersonD[j];
}
alert(peopleString);
alert(taskString);
}
}
});
答案 0 :(得分:1)
即使您在actions
哈希中定义操作,也会在控制器的上下文中调用它们。所以this
是控制器,而不是动作哈希。
这就是this.shuffle
不起作用的原因:因为shuffle
未在控制器上定义,而是在actions
哈希上。
这将是做什么的:
this.actions.shuffle();
但是this
操作的shuffle
上下文会出错:它将是actions
哈希,而不是控制器。所以你必须覆盖它:
this.actions.shuffle.call(this);
但这有点难看对吗?所以回答你的问题:
或者是不应该被其他行动使用的行动?
是的!我建议不来执行此操作,而是在同一controller.js
文件中调用普通函数或使用控制器上定义的常规方法。所以要么这样做:
import Ember from 'ember';
function foo(arg) {
...
return something;
}
export default Ember.Controller.extend({
actions: {
bar() {
let baz = foo(this.things);
...
}
}
}
或者这个:
import Ember from 'ember';
function foo(arg) {
...
return something;
}
export default Ember.Controller.extend({
foo(arg) {
...
return something;
},
actions: {
bar() {
let baz = this.foo(this.things);
...
}
}
}
关于actions
哈希的想法是将模板调用的函数(actions
)与常规方法分开。