如何在指令中使用$ timeout服务?

时间:2016-08-26 10:27:55

标签: jquery angularjs angularjs-directive timeout angularjs-timeout

基本上,我想在angular操纵DOM之后测量元素的宽度。所以我想使用$ timeout,但它一直让我犯错误。

HTML

   <div ng-app="github">
      <ul mynav>
        <li ng-repeat="nav in navItems">{{nav.name}}</li>
      </ul>

      </div>
    </div>

CSS

ul,li {
  display:inline-block;
}
li {
  margin-right:1em;
}

JS

(function() {
  angular.module('github', [])
    .directive('mynav', function($window) {
      return {
        restrict: 'A',
        link: function(scope, element, attrs, timeout) {
          scope.navItems = [{
            "name": "home"
          }, {
            "name": "link1"
          }, {
            "name": "link2"
          }, {
            "name": "link3"
          }];
          timeout(function() {
            console.log($(element).width());
          })
        }

      }
    });
})();

3 个答案:

答案 0 :(得分:10)

link函数不是注入依赖项的正确位置。它定义了如下所示的参数序列。你不能把依赖放在那里。

link(scope, element, attrs, controller, transcludeFn) {

在指令$timeout中注入function依赖项。

(function() {
  angular.module('github', [])
    .directive('mynav', function($window, $timeout) { //<-- dependency injected here
      return {

然后在$timeout函数

中使用注入link
$timeout(function() {
    console.log(element.width());
})

答案 1 :(得分:-1)

只需将setinterval替换为timeout,如下所示:

(function() {
  angular.module('github', [])
    .directive('mynav', function($window) {
      return {
        restrict: 'A',
        link: function(scope, element, attrs, timeout) {
          scope.navItems = [{
            "name": "home"
          }, {
            "name": "link1"
          }, {
            "name": "link2"
          }, {
            "name": "link3"
          }];
          setInterval(function() { // replpace 'timeout' with 'setInterval'
            console.log($(element).width());
          })
        }

      }
    });
})();

希望它适合你。

答案 2 :(得分:-1)

setInterval(function(){
    // code here
    $scope.$apply();
}, 1000); 

$ apply作为提醒,因为这是一个外部jQuery调用,你需要告诉angular更新DOM。

$ timeout是一个角度版本自动更新DOM