从注入的服务初始化的指令隔离作用域



它必须是smth简单的,但到目前为止我还不能得到它。

jsfiddle

想象一下,你有一个范围孤立、依赖于你的服务的指令。为什么不能在声明作用域的地方初始化服务中的变量?但是,如果您在控制器中初始化该字段,则工作得非常好。

app.directive('myDirective', function(i18n) {
return {
restrict: 'E',
replace: true,
scope:{
i18n:i18n
},
template: '<div ng-bind="i18n('myString')"></div>',
controller: function($scope){
//$scope.i18n = i18n //it works if you put it here
}
};
}); 

i18n只是我返回对象的函数的局部变量。就从变量初始化对象而言,这是非常好的。。。那么,这是某种角度限制吗?它与通过"@"、"="绑定数据的可能性有关。。。还是怎样有人能为我解释一下这件事吗…

参考Angular Docs:中的综合指令API页面

范围

  • 如果设置为true,则将为此指令创建一个新的作用域。(…)
  • 如果设置为{}(对象散列);隔离物";范围被创建。(…)
    • @或@attr-将本地作用域属性绑定到DOM属性的值。(…)
    • =或=attr-在本地作用域属性和通过attr属性值定义的名称的父作用域属性之间设置双向绑定。(…)
    • &或者&attr-提供了一种在父作用域上下文中执行表达式的方法。(…)

换句话说,这不是指令定义对象的scope属性的作用。它不是作用域本身的定义,而是确定指令是否有隔离作用域,如果有,它如何链接到其父作用域。

最好的解决方案是,正如您已经建议的那样,将i18n附加到controllerlink函数中的作用域。

正如您所说,设置$scope.i18n = i18n是可行的。不能使用指令的scope参数来注入服务。

以下是关于如何将服务注入指令的演示。我稍微清理了一下你的代码:

演示

此解决方案在代码缩小后将不起作用。下面是一个扩展的例子,它也可以缩小:

演示

最新更新