2013-04-06 53 views
2

我剛開始用angular.js今天,當我在寫我的控制器:Angularjs控制器 - 不平凡的初始狀態

myApp.controller('RepetitionController', ['$scope', '$location', 'repetitionService', 
    function ($scope, $location, repetitionService) { 



     $scope.questions = repetitionService.getQuestions(); 
     $scope.questionsLeft = $scope.questions.length; 
     $scope.questionsAnswered = 0; 
     $scope.percentageLeft = ($scope.questionsLeft == 0 ? 100 : 0); 
     $scope.repetitonState = ??? 
     $scope.endRepetition = function() { 
      repetitionService.clearSelectedSets(); 
      $location.path("/setsAndCollections"); 
     } 

     $scope.submitAnswer = function() { 
      alert("alert"); 
     } 
    }]); 

我開始懷疑。

你可以看到我使用三元運算符來創建$scope的初始狀態,現在在我的repetitionState字段中我想要類似這樣的(questionsLeft === 0 ? 'finished' : questions[0].type)

有沒有什麼辦法可以定義一個函數,在填充$scope對象之後調用,某種後構造函數?

或者,也許有一種方法可以在功能「監視」,所以我可以寫

$scope.repetitionState = function(){ 
    ///logic here 
}; 

我只是擔心會有,我需要寫logicalExpression ? anonymousFunction() : someOtherAnonymousFunction()的情況下,對我來說,嵌套所有這些匿名函數(現在)都有點難以閱讀,我想知道在這種情況下是否有一些angular有用。

回答

4

你絕對可以看到一個功能。 $watch接受一個字符串或函數watchExpression參數。如果您使用的是函數,則當前作用域將作爲第一個參數傳遞給該函數。

要記住一個重要的事情是watchExpression函數應該是冪等的,所以確保您只更新偵聽器函數中的作用域。

$scope.repititionState = getRepititionState($scope); 

$scope.$watch(getRepititionState, function(newVal, oldVal, scope) { 
    scope.renditionState = newVal; 
}); 

function getRepititionState(scope) { 
    var repititionState; 
    // your logic here, just remember to set and return repititionState 
    return repititionState; 
} 
+0

+1「idempotent」 – jszobody 2013-04-06 22:42:32

+0

謝謝!這會派上用場。 – Andna 2013-04-06 22:59:21

1

不管你想要去引用repititionState你爲什麼不引用它的功能?

例如:讓我們假設你要使用repititionState讓你的類,如下

<div ng-class="repititionState"></div> 

$scope.repititionState = ($scope.questionsLeft === 0 ? 'finished' : $scope.questions[0].type) 

所以,每當你的問題已完成該div獲得一個類的finished。爲了使這個repititionState依賴於另一個變量(就像你想要的那樣),就像使它變成一個函數一樣簡單。

<div ng-class="repititionState()"></div> 

注意額外的()現在標誌着repititionState的功能。

$scope.repititionState = function(){ 
    return ($scope.questionsLeft === 0 ? 'finished' : $scope.questions[0].type); 
} 

如果你是一個ng-repeat內,那麼你甚至可以通過$index使這一功能更通用。

$scope.repititionState = function($index){ 
return ($scope.questionsLeft === 0 ? 'finished' : $scope.questions[$index].type); 
} 

這通常被稱爲如在其他框架中所計算的屬性。在Angular中它只是一個功能。希望這可以幫助。

+0

我並不認爲這會如此簡單,我打過仗可以引用正常值並通過使用控制器中的函數來改變它們,謝謝。 – Andna 2013-04-06 23:43:13

相關問題