为什么这个指令不能在角度1.5中执行工厂的功能?

时间:2017-05-13 21:16:28

标签: angularjs

这个工厂和指令有什么问题?

app.factory('myTools', function() {
  return {
    days: function() { return 31; }
  };
}) ;

app.directive('listDays', ['myTools',function(myTools){
   return {
    restrict: 'E',
    template: '<div>days = {{myTools.days()}}</div>'
   }
}]);

以下html不起作用

<list-days></list-days>

仅显示

days =

见Plinker:http://plnkr.co/edit/HWU2dGclzbZHzzmO9ise

2 个答案:

答案 0 :(得分:1)

如果您愿意,也可以将其全部保留在指令中。这只是因为工厂方法不是范围变量。只需要以某种方式使$ scope访问视图。

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

app.factory('myTools', function() {
  return {
    days: function() {
      return 31;
    }
  };
});

function ListDays(myTools) {
  return {
    restrict: 'E',
    template: '<div>days = {{days}}</div>',
    link: function($scope) {
      $scope.days = myTools.days();
    }
  };
}
app.directive('listDays', ListDays);

app.controller('MainCtrl', function($scope) {});

修改

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

app.factory('myTools', function() {
  return {
    days: function() {
      return 31;
    }
  };
});

function ListDays(myTools) {
  return {
    restrict: 'E',
    template: '<div>days = {{myTools.days()}}</div>',
    link: function($scope) {
      $scope.myTools = myTools;
    }
  };
}
app.directive('listDays', ListDays);

app.controller('MainCtrl', function($scope) {});

答案 1 :(得分:0)

要达到预期效果,请使用以下选项

1.将工厂注入Ctrl-MainCtrl
2.创建范围变量 - 天并在指令中使用它 3.代码中的指令使用父作用域(控制器/指令所在的位置)

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

app.factory('myTools', function() {
  return {
    days: function() { return 31; }
  };
}) ;

app.directive('listDays', function(){
  return {
    restrict: 'E',
    template: '<div>days = {{days}}</div>'
  }
});

app.controller('MainCtrl', function($scope,myTools) {
  $scope.days = myTools.days();
});

Plunker- http://plnkr.co/edit/Kny9SSp7c0yyc3ItVXvy?p=preview

更新:通过将工厂注入指令链接范围

的独立指令
var app = angular.module('plunker', []);

app.factory('myTools', function() {
  return {
    days: function() { return 31; }
  };
}) ;

app.directive('listDays', ['myTools',function(myTools){
  return {
    restrict: 'E',
    template: '<div>days = {{days}}</div>',
    link: function (scope, element, attrs) {
            scope.days = myTools.days();
        }
  }
}]);

app.controller('MainCtrl', function($scope) {

});

Plunker- http://plnkr.co/edit/Fh9i2FqbglPHWIBYRsVm?p=preview