在控制器内部使用动作?

时间:2016-07-24 00:07:33

标签: javascript ember.js

我是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);

    }
  }
});

1 个答案:

答案 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)与常规方法分开。