2016-07-28 15 views
2

Ich möchte $ Timeout in meiner benutzerdefinierten AngularJS-Direktive verwenden, aber es funktioniert nicht. Meine letzte Implementierung sieht wie folgt:

var App = angular.module('App', []); 

App.controller('Controller', function($scope){ 
    $scope.test = true; 
    $scope.toggle = function(){ $scope.test = !$scope.test;}; 
}); 

App.directive('showTemporary', ['$timeout', function ($timeout) { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attr){ 
       scope.$watch(attr.showTemporary, function(value){ 
       element.css('display', value ? '' : 'none'); 
      }); 
      $timeout(element.css('display', 'none'), attr.hideDelay); 
     } 
    } 
}]); 

und Markup:

<div ng-app='App'> 
    <div ng-controller='Controller'> 
     <button ng-click='toggle()'>toggle</button> 
     <div show-temporary='test' hide-delay="5000"> visible</div> 
    </div> 
</div> 

Antwort

4

Sie benötigen Funktion $ timeout Versuch passieren:

$timeout(function() { 
element.css('display', 'none') 
}, attr.hideDelay); 

Auch sollten Sie Attribute beobachten, nicht beobachten .

attr.$observe('showTemporary', function(value){ 
       element.css('display', value ? '' : 'none'); 
      }); 

Ihre html wurde auch gebrochen:

<div show-temporary="{{test}}" hide-delay="5000"> visible</div> 
+0

Danke, du hast mir sehr geholfen http://jsfiddle.net/5j08dn5s/ – snowfinch27

+0

@ snowfinch27 dein Code wurde an einigen Stellen kaputt http://jsfiddle.net/dtjfojt1/ – sielakos

+0

danke, du hast mir sehr geholfen, jetzt Element verschwindet aster Verzögerung, aber nur einmal, nächste Aufgabe für mich ist es, Verzögerung mit jedem Klick arbeiten zu lassen, werde ich sehr dankbar sein, wenn Sie mir helfen, hier ist die Arbeit Geige: [Link] (http://jsfiddle.net/ 5 j08dn5s /) – snowfinch27

2

Achten Sie genau auf die $timeout docs. Der erste Parameter ist FUNCTION, so möchten Sie es wahrscheinlich so sein:

$timeout(function(){ 
    element.css('display', 'none') 
}, attr.hideDelay); 
0

Ich bin nicht sicher, was Sie versuchen, hier zu tun, aber das ist, wie Sie $ timeout verwenden sollten

$timeout([fn], [delay], [invokeApply], [Pass]); 

$timeout(function() {element.css('display', 'none')}, attr.hideDelay);