48

我想直接在 html 中使用几个常量(并且在控制器中使用几次)。

例如,这是主应用程序模块:

angular.module('website', [])
.constant('ROUTES', (function () {
    return {
        SIGN_IN: '/sign/in'
  }
})())
.config([..., 'ROUTES', function(..., ROUTES {
    $routeProvider.when(ROUTES.SIGN_IN, {templateUrl: 'pages/sign_in.html', controller:     'SignInController'});
}]);

所以这很清楚,如何使用来自控制器的常量。

但我怎么能做这样的事情:

<html ng-app="website"> 
<body>
<a href="{{ROUTES.SIGN_IN}}">Sign in</a>
</body>
</html>

关键是将所有路线保持在一个地方。那么,我可以这样做,还是我选择了错误的方式?

4

4 回答 4

79

恕我直言,更好的方法是在 html 中使用$rootScope ,每个范围都从 $rootScope 继承,因此如果当前范围角度中不存在变量,请使用 $rootScope 中声明的变量。

一个好方法是在运行“阶段”中初始化它

angular.module('myApp')
  .run(function ($rootScope) {
      $rootScope.ROUTES = ROUTES
   });

 

于 2013-07-06T17:36:18.230 回答
19

与其他答案略有相似,但 IMO 更清洁:

angular.module('website')
    .constant("ROUTES", {
        SIGN_IN: "/sign/in"
    })
    .run(function ($rootScope, ROUTES) {
        $rootScope.ROUTES = ROUTES;
    });

和:

<a href="{{ROUTES.SIGN_IN}}">Sign in</a>

HTH

于 2015-10-28T14:11:23.437 回答
16

我也喜欢 $rootScope 方法,但在某些情况下我使用了过滤器。

作为一个简化的例子,假设有一个常量 CONFIG 在某处定义为一个具有名为 BuildVersion 的属性的对象。您可以创建一个像这样的过滤器:

angular.module('myApp')
  .filter('interpolate', ['CONFIG', function (CONFIG) {
      return function (text) {
          return String(text).replace(/\%VERSION\%/mg, CONFIG.BuildVersion);
      };  
  }]);

在 HTML 中:

<html ng-app="website"> 
    <body>
        <div>{{'%VERSION%' | interpolate}}</div>
    </body>
</html>

或者

<html ng-app="website"> 
    <body>
        <div>{{'bla bla bla %VERSION%.' | interpolate}}</div>
    </body>
</html>
于 2014-07-11T19:31:44.170 回答
1

我们也可以使用 helper,类似于 ROR。

https://gist.github.com/merqlove/491023bcdd2145eef169#file-readme-md

于 2014-08-14T10:10:19.143 回答