这是因为指令是由
exampleApp
模块创建的根作用域的子级。将
services
、
controllers
和
directives
模块注入到
exampleApp
中,从子级到根作用域实现了原型继承。如果将来由
exampleApp
创建的根作用域排除了
services
模块,就会危险地依赖于
toDate
过滤器对
linkBox
指令的可访问性。
Erstad Stephen在他的回答中写的部分是正确的,但他的示例不起作用,因为$injector要求过滤器名称具有
Filter
后缀,如
$filterProvider文档所述。
以下代码可以工作:
angular.module('exampleApp',['controllers','directives']);
angular.module('controllers',[]).controller('app_ctrl',['$scope',function($scope){
$scope.dateVal = 20131010;
}]);
angular.module('services',[]).filter('toDate',[function(){
function func(ymd){
ymd = ymd + "";
var y = ymd.substring(0,4);
var m = ymd.substring(4,6);
var d = ymd.substring(6);
return (+m) + "/" + (+d) + "/" + y;
}
return func;
}]);
angular.module('directives',['services']).directive('linkBox', ['toDateFilter', function(toDate){
var dir = {
transclude:false,
scope:{isolateVar:'@linkBox'},
replace:true,
template:'<p>Filtered value: {{isolateVar | toDate}}</p>',
link: function lfn(scope, instance, attr){
var a = angular.element(instance);
a.text(scope.isolateVar.name);
console.log(scope);
}
};
return dir;
}]);
这是可运行的JSBin: http://jsbin.com/ICUjuri/2/edit