我可以直接从AngularJS下的HTML访问模块常量

Ser*_*lov 45 javascript angularjs

我想在html中直接使用少量常量,在控制器中几次使用.

例如,这是主要的app模块:

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'});
}]);
Run Code Online (Sandbox Code Playgroud)

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

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

<html ng-app="website"> 
<body>
<a href="{{ROUTES.SIGN_IN}}">Sign in</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

Fab*_*nte 78

恕我直言更好的方法是使用$ rootScope 在html中,每个作用域都继承自$ rootScope,因此如果当前作用域中不存在变量,则使用$ rootScope中声明的变量.

一个好的(恕我直言)方法是在运行 "阶段" 初始化它

angular.module('myApp')
  .run(function ($rootScope) {
      $rootScope.ROUTES = ROUTES
   });
Run Code Online (Sandbox Code Playgroud)

 

  • 请记住,`$ rootScope`中定义的值不能直接在具有隔离范围的指令中访问.在这种情况下,您可以在视图中使用`$ root.ROUTES`获取此值. (7认同)

Nim*_*imo 17

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

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

和:

<a href="{{ROUTES.SIGN_IN}}">Sign in</a>
Run Code Online (Sandbox Code Playgroud)

HTH


小智 16

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

作为一个简化示例,假设有一个常量CONFIG定义为具有名为BuildVersion的属性的对象.你可以创建一个像这样的过滤器:

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

在HTML中:

<html ng-app="website"> 
    <body>
        <div>{{'%VERSION%' | interpolate}}</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

要么

<html ng-app="website"> 
    <body>
        <div>{{'bla bla bla %VERSION%.' | interpolate}}</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)