2014-09-02 2 views
2

나는이 컨트롤러 기능이 작업을 수행하기 전에 완료 될 때까지 내 지시를 기다려야합니다 :내 컨트롤러가 다른 것들

$scope.keypadEnter = function() { 
    userService.isCodeValid($scope.code).then(function (result) 
    { 
     if (JSON.parse(result.data)) { 
      $scope.highlight("lime").then(function() {; 
       console.log("redirecting ..."); 
       $location.path('/clockin'); 
      }); 
     } 
     else 
     { 
      $scope.highlight("red"); 
     } 

     $scope.code = ""; 
    }); 
}; 

컨트롤러는 다음의 경우에 true를 반환하는 서비스 (userService) 함수 (isCodeValid)를 호출 지정된 코드는 유효하고, 그렇지 않으면 false입니다.

봐 밀접하게이 두 라인에서 :

angular.module('clockin').directive('grDisplay', function() { 
    return { 
     restrict: 'A', 
     link: function ($scope, $element, $attrs) { 
      $scope.highlight = function (color) { 
       $element.effect("highlight", { color: color }, 500); 
      } 
     } 
    }; 
}); 

나는이 두 줄을 싶습니다

$scope.highlight("lime"); 
$location.path('/clockin'); 

$의 scope.highlight은 JQuery와 (강조) 애니메이션을 트리거하는 지시 기능입니다 동기식, 강조 표시 애니메이션 ($scope.highlight(...)) 리디렉션되기 전에 볼 수 있습니다. ($location.path(...)).

어떻게하면됩니까?

업데이트 : 다음에

angular.module('clockin').directive('grDisplay', function ($q, $timeout) { 
    return { 
     restrict: 'A', 
     link: function ($scope, $element, $attrs) { 
      $scope.highlight = function (color) { 
       var deferred = $q.defer(); 
       $element.effect("highlight", { color: color }, 500) 
       $timeout(deferred.resolve(), 5000); 

       return deferred.promise; 

      } 
     } 
    }; 
}); 

그리고 내 컨트롤러 기능 : 나는 (I 5 초에 타임 아웃을 과장되게 한) 다음에 내 지시 코드를 변경 한

$scope.keypadEnter = function() { 
    userService.isCodeValid($scope.code).then(function (result) 
    { 
     if (JSON.parse(result.data)) { 
      $scope.highlight("lime").then(function() {; 
       console.log("redirecting ..."); 
       $location.path('/clockin'); 
      }); 
     } 
     else 
     { 
      $scope.highlight("red"); 
     } 

     $scope.code = ""; 
    }); 
}; 

실행중인 경우에도 동일한 결과가 나타납니다. 강조 표시는 볼 수 있지만 완료 할 시간이 없습니다. 나는 방향을 바꾼다.

그리고이 오류가 :

TypeError: Objet expected at Anonymous function 

(hxxp : // 로컬 호스트 : 18000/스크립트/angular.js : 14261 : 11) completeOutstandingRequest 에서 (hxxp : // 로컬 호스트 : 18000/스크립트/angle.js : 4387 : 7) 익명 함수 (hxxp : // localhost : 18000/Scripts/angular.js : 4688 : 7)

아이디어가 있으십니까?

+0

당신은 단순히 $ 값이 userService에 의해 반환 볼 수 있었다이다 .isCodeValid ($ scope.code)? – enguerranws

+0

범위는 어떻습니까? 지시문의 $ broadcast는 어떻습니까? –

+0

내 대답을 편집했습니다. $ timeout (deferred.resolve() ... $ timeout (deferred.resolve, 5000))으로 변경하십시오. – sma

답변

0

$scope.highlight 함수 호출 내에서 지연을 사용할 수 있습니다. 이 함수는 지연을 반환 할 수 있으며 해결 된 경우 $location.path을 변경합니다.

이 물리적으로 하이라이트를보고 너무 빨리 발생하면, 당신은 또한의 결의에 $timeout를 추가 할 수있는 연기 :

$scope.highlight("lime").then(function() { 
    $location.path('/clockin'); 
}); 
+0

입력 해 주셔서 감사합니다. @sma에 내 지시어 코드를 추가했습니다. 질문. 링크 개체에 $ q를 통합하는 방법은 무엇입니까? –

+0

주 지시문에 생성자 함수로 삽입하십시오. function MyDirective ($ q, $ timeout) – sma

+0

내 대답을 편집하여 잘 설명해주었습니다. – sma

0
:

function MyDirective($q, $timeout) { 
    controller : function ($scope, $element) { 

     $scope.highlight = function() { 
      var deferred = $q.defer(); 

      // do your highlight stuff 

      // Resolve the deferred a second later 
      $timeout(deferred.resolve, 1000); 

      return deferred.promise; 
     } 
    } 
); 

은 그럼 당신은 이런 식으로 함수를 호출 할

userService.isCodeValid ($ scope.code)가 반환하는 값을 간단히 볼 수 있습니다.

뭔가 같은 :

$scope.val = userService.isCodeValid($scope.code); 
$scope.$watch('val', function() { 
    if($scope.val === true){ 
     $scope.highlight("lime"); 
     $location.path('/clockin'); 
    } 
    else { 
     $scope.highlight("red"); 
    } 
}); 

주 나는 사람들의 JS 전문가와 많은 아니에요 이런 말을 할 수는 더러운 코드 :

+0

입력 해 주셔서 감사합니다. @ euguerranws하지만 내 문제가 isCodeValid 함수에서 논리 아닙니다. 값을 보더라도 $ scope.highlight 및 $ location.path는 비동기 적으로 실행됩니다. 그것이 내가 피할 필요가있는 것이다. –

관련 문제