2016-07-24 13 views
0

Ich bin neu zu ember und ich würde gerne eine separate Aktion (shuffle) in einer meiner Aktionen (zuweisen) verwenden. Ich weiß, dass ich hier etwas falsch mache, die Shuffle-Methode macht gar nichts. Rufe ich es falsch an oder sollen Aktionen nicht von anderen Aktionen verwendet werden? Hier ist der Code:Verwenden von Aktionen innerhalb eines Controllers?

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

Muss die Schnittstelle die Shuffle-Aktion auslösen? Oder versuchen Sie nur, eine Methode einzurichten, die mindestens eine Aktion aufrufen muss? –

+0

Ich versuche das letztere zu tun. – jvangore31

Antwort

1

Auch wenn Sie Ihre Aktion innerhalb des actions Hash definieren sie im Zusammenhang mit der Steuerung aufgerufen werden. So ist this der Controller, nicht der Action-Hash.

Dies ist der Grund, warum this.shuffle nicht funktioniert: Weil shuffle nicht auf dem Controller, sondern auf dem actions Hash definiert ist.

Was tun, ist dies:

this.actions.shuffle(); 

Aber dann this Rahmen der shuffle Aktion wäre falsch: Es wäre der actions Hash sein, nicht die Steuerung. Also müssten Sie das überschreiben:

this.actions.shuffle.call(this); 

Aber das ist ein bisschen hässlich oder? Also, um Ihre Frage zu beantworten:

oder sind Aktionen nicht von anderen Aktionen verwendet werden?

Ja! Ich würde nicht empfehlen, dies zu tun, sondern rufen Sie eine normale Funktion innerhalb der gleichen controller.js Datei oder verwenden Sie eine normale Methode auf dem Controller definiert. Also entweder dies tun:

import Ember from 'ember'; 

function foo(arg) { 
    ... 
    return something; 
} 

export default Ember.Controller.extend({ 
    actions: { 
    bar() { 
     let baz = foo(this.things); 
     ... 
    } 
    } 
} 

Oder diese:

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); 
     ... 
    } 
    } 
} 

Die Idee über die actions Hash genannt wird durch die Vorlage (actions) und normale Methoden zwischen den Funktionen zu trennen.

+0

Danke, Bruder, das hat sehr geholfen! – jvangore31

+0

Dies ist, was ich vorschlagen wollte, nachdem ich herausgefunden habe, was Sie erreichen wollten. Gut gemacht. :) –

Verwandte Themen