2016-07-26 2 views
1

У меня есть приложение, похожее на это:

angular.module('slots', []).directive('slot', function() { 
    var spin = { 
     fn: { 
      go: function (scope) { 
       //many code and functions here(animation for 3000ms) 
       //i will just use setTimeout for example 
       setTimeout(function() { 
       scope.btnTrigger = false; 
       }, 3000) 
      }, 
      link: function (scope, ele, attrs) { 
       if (attrs.trigger && attrs.trigger !== undefined) { 
        if (scope[attrs.trigger] !== undefined) { 
         scope.$watch(attrs.trigger, function (newValue, oldValue) { 
          if (newValue) { 
           spin.fn.go(scope); 
          } 
         }); 
        } 
       } 
      } 
     }; 
    return spin; 
}); 

var myApp = angular.module('myApp',['slots']); 
myApp.controller('MyCtrl', function ($scope, $timeout) { 
    $scope.btnTrigger = false; 
    $scope.btnClick = function() { 
     if($scope.btnTrigger == false){ 
     $scope.btnTrigger = true; 
     } 
    }; 
}); 

Проблема кнопка не будет работать после первого щелчка. Он отлично работает, если я помещаю scope.btnTrigger = false; чуть ниже вызова функции spin.fn.go(). Но я действительно хочу, чтобы кнопка была доступна только после завершения анимации (например, после 3000 мс).

+0

'if (scope.btnTrigger == false) {' должен вызывать ошибку, так как область действия не определена. Вероятно, вы имели в виду '$ scope.btnTrigger' – nubinub

+0

@nubinub, который был опечален, извините –

ответ

1

Проблема заключается в вашей функции go() в директиве. Используйте $ timeout вместо setTimeout(). вы обновляете область действия после определенного таймаута, поэтому угловой не знает, что вы обновили область действия. Но если вы используете $ timeout, то угловой позаботится о вызове Scope. $ Apply(), где он отслеживает изменения области & соответственно обновляет интерфейс.

Это должна быть обновленная функция go().

go: function (scope) { 
      //many code and functions here(animation for 3000ms) 
      $timeout(function() { 
      scope.btnTrigger = false; 
      }, 3000); 
     } 
+0

Что делать, если я вызываю другую функцию с jquery animate() oncomplete? например: elem.animate ({"margin-top": "-100px"}, {'duration': 3000, 'easing': «EaseInOut», complete: function() {scope.btnTrigger = false;}} –

+0

Тогда в этом случае u может написать complete: function() {scope. $ Apply (function() {scope.btnTrigger = false;});} –

+0

scope. $ Apply (function() {scope.btnTrigger = false;}) , я должен был найти это в документации –

Смежные вопросы