指令隔离范围从注入服务初始化

时间:2014-02-28 09:37:27

标签: javascript angularjs

它必须简单,但到目前为止我无法得到它。

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只是我返回一个对象的函数的局部变量。在从变量初始化对象方面它是完全正确的......所以它是某种角度限制并且与通过'@','='...或什么来绑定数据的可能性有关? 能否有人为我揭开这件事......

2 个答案:

答案 0 :(得分:4)

参考Angular Docs的The Comprehensive Directive API页面:

  

范围

     
      
  • 如果设置为true,则将为此指令创建新范围。 (...)
  •   
  • 如果设置为{}(对象哈希),则会创建一个新的“隔离”范围。 (......)   
        
    • @或@attr - 将本地范围属性绑定到DOM属性的值。 (...)
    •   
    • = or = attr - 在本地范围属性和通过attr属性的值定义的name的父范围属性之间设置双向绑定。 (...)
    •   
    • &安培;或&amp; attr - 提供在父作用域的上下文中执行表达式的方法。 (...)
    •   
  •   

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

最佳解决方案是按照您的建议,将i18n附加到controllerlink函数的范围。

答案 1 :(得分:1)

如你所说设置$scope.i18n = i18n是要走的路。您不能使用指令的scope参数来注入服务。

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

DEMO

此代码解析后,此解决方案无效。这是一个扩展的例子,它也将缩小:

DEMO