2013-02-21 61 views
1

這似乎不起作用。將參數傳遞給random()回調可以嗎?使用Angular隨機化DOM元素

function getAnswers($scope){ 
    $scope.answers = conjugate("작다"); 
    $scope.$on('$viewContentLoaded', random($(".answer"))); 
} 

function random(r) { 
    r.children().sort(function() { 
     return (Math.round(Math.random()) - 0.5); 
    }).appendTo(r); 
}; 
+0

什麼是「隨機」?它會返回一個函數嗎? – 2013-02-21 17:15:45

+0

它隨機化元素 – Tules 2013-02-21 17:18:26

回答

1

這不是真正的「角度的方式」來做到這一點。

你不應該在做任何DOM操作,甚至在控制器中引用DOM。

相反,您要做的是操縱影響您視圖的模型數據。在你的情況,我會隨機數據的陣列,而不是隨機的DOM元素本身:

function MyCtrl($scope) { 
    $scope.answers = [ /*... some data here ... */]; 

    $scope.randomizeAnswers = function() { 
     fisherYates($scope.answers); 
    }; 

    //a good randomization function 
    //(see: http://stackoverflow.com/questions/2450954/how-to-randomize-a-javascript-array) 
    function fisherYates (myArray) { 
    var i = myArray.length, j, tempi, tempj; 
    if (i == 0) return false; 
    while (--i) { 
     j = Math.floor(Math.random() * (i + 1)); 
     tempi = myArray[i]; 
     tempj = myArray[j]; 
     myArray[i] = tempj; 
     myArray[j] = tempi; 
     } 
    } 
} 

使用$上可能是不必要在這裏,好像你只是想後陣隨機化被加載?這真的要取決於你的方法在做什麼。

我不知道你的conjugate()方法的作用......但假定它做某種異步工作來返回數據,你可能必須使用$q並從該方法返回一個承諾。然後,您可以將您的隨機電話放入一個.then()回調函數中,該函數將在數據加載時觸發。

+0

謝謝Blesh,我來自一個純粹的jQuery背景,從未使用過適當的MVC框架,所以我認爲在適應新的範式之前需要一段時間! – Tules 2013-02-21 18:13:49

+0

沒關係...... Angular的大部分問題都是這樣的。 – 2013-02-21 18:14:51

+0

共軛不是異步的,我只是想我應該等到DOM準備好操作。我希望結果每次都是隨機的,所以我也應該像這樣從控制器內調用函數? $ scope.randomizeAnswers = function(){ \t fisherYates($ scope.answers); \t}(); – Tules 2013-02-21 18:20:14