访问模板中注入的东西

时间:2014-07-17 21:24:15

标签: angularjs

如果我想做一些像这样的蠢事:

foo = 
   bar:'awesome bar'

app.constant "foo", foo

ctrl = ($scope, foo)->

<div ng-controller='ctrl'>
    {{foo.bar}} <!-- that won't work --> 
</div>

是否可以以某种方式访问​​foo而无需将其放入$scope

4 个答案:

答案 0 :(得分:1)

不,$scope是&#34;胶水&#34;在模板和它的控制器之间。如果您正在注入foo并希望该模板直接可用,则必须将其放在$scope上。

这也适用于指令的linkcontroller函数。

答案 1 :(得分:1)

假设'foo'是一个app常量,你可以将它注入你的指令并在你的模板函数中使用它:

app.directive('test', function(foo) {
    return { 
        restrict: 'A',
        template: function() { 
            return foo.bar;
        } 

    }
});

<强> HTML

<div ng-controller='ctrl' test>
</div>

这将呈现:

<div ng-controller='ctrl' test>
    awesome bar
</div>

答案 2 :(得分:1)

是的,可以使用controllerAs语法,但仍需要将foo放在某些内容上。

<div ng-controller='ctrl as ctrl'>
    {{ctrl.foo.bar}}
</div>

然后在你的控制器中

.controller('ctrl', (foo)->
  this.foo = foo;

答案 3 :(得分:1)

另外,值得一提的是,$ rootScope偶尔会用于此,因为模板表达式可以在范围链中向上查找。在很多情况下,这是非常糟糕的编程习惯......除了一些。以下是我发现的一些事情:

  • Angular ui-router docs建议将$ state和$ stateParams放入$ rootScope。它们在任何地方都被使用,所以它不一定是邪恶的,因为它绝对是一个全局的单例服务,在整个应用程序中具有相同的功能。

  • 如果你有几个常量(我不会想要数百个)和应用程序范围,你只需通过不断设置它们就必须将它们传递到范围链中您制作的每个控制器(例如,一个页面范围的变量,将您的应用指向Dev,QA或Production框?)...假装任何部分的值是&#34; local&#34;范围很小。所有软件开发都是妥协。我认为减少维护费用和便利性可能会使这个值得...

在这两种情况下,您仍然可以在某处(通常在主控制器或最顶级控制器中)使用该行代码...但至少您只能使用一次。 :)