module.config中提供哪些提供者/服务?

Pic*_*els 12 angularjs

我想使用$ document从输入字段中获取服务器值.

var base_url = $document[0].getElementById('BaseUrl').value;
Run Code Online (Sandbox Code Playgroud)

基本URL用于抓取模板.

var base_url = $document[0].getElementById('BaseUrl').value;

$routeProvider.when('/alert', {
  controller: function () { },
  templateUrl: base_url + '/partials/instances.html'
});
Run Code Online (Sandbox Code Playgroud)

由于$ document会抛出一个错误,我不知道它在配置中是不可用的?有没有办法找出可用的和不可用的?我也可以使用$ http从服务器获取数据,但这也是不可用的.

pko*_*rce 16

AngularJS模块分两个阶段进行自举:

  • Configuration phase 只有提供者和常量可用的地方.
  • Run phase基于注册提供商实例化服务的地方.在此阶段,常量仍然可用,但不是提供者.

AngularJS 文档(部分:"模块加载和依赖关系")提供了对此的见解:

模块是配置和运行块的集合,它们在引导过程中应用于应用程序.在最简单的形式中,模块由两种块的集合组成:

配置块 - 在提供程序注册和配置阶段执行.只有提供程序和常量才能注入配置块.这是为了防止在完全配置服务之前意外实例化服务.

运行块 - 在创建注入器后执行并用于启动应用程序.只有实例和常量才能注入运行块.这是为了防止在应用程序运行时进一步进行系统配置.

鉴于上述情况,您只能注入常量和提供者(Provider在API文档中标有后缀).这可能会回答您的问题,但无法解决您的模板加载问题...

我想知道你是否不能简单地在HTML中使用基本标签然后只使用相对路径(到基地)而不指定绝对路径?就像(如果基础配置正确):

$routeProvider.when('/alert', {
  controller: function () { },
  templateUrl: 'partials/instances.html'
});
Run Code Online (Sandbox Code Playgroud)


小智 16

虽然这个问题已得到普遍回答,但这里有一点针对问题中使用的具体示例:

如何使用角度常量来定义部分的baseUrl(或定义表示服务器值并使其可用于配置的其他常量):

// file: app.js
'use strict';

/* App Module */
angular.module( 'myApp', [] )

  // define the templateBaseUrl
  .constant( 'templateBaseUrl', 'themes/angular/partials/' );

  // use it in configuration
  .config(['$routeProvider','templateBaseUrl', function($routeProvider,templateBaseUrl) {
    $routeProvider
      .when( '/posts', {
        templateUrl : templateBaseUrl + 'post-list.html',
        controller  : PostListCtrl
      })
      .when( '/posts/:postId-:slug', {
        templateUrl : templateBaseUrl + 'post-view.html',
        controller  : PostViewCtrl
      })
      .when( '/about', {
        templateUrl : templateBaseUrl + 'about.html',
        controller  : AboutPageCtrl
      })
      .when( '/contact', {
        templateUrl : templateBaseUrl + 'contact.html',
        controller  : ContactPageCtrl
      })
      .otherwise({
        redirectTo: '/posts'
      })
    ;
  }]);
Run Code Online (Sandbox Code Playgroud)

在我看来,这有几个好处:

  • 如果您移动视图,则只需在一个位置更新代码
  • 如果您的部分内容深深嵌套在项目布局中,"templateBaseUrl"不会产生与整个路径一样多的噪音
  • 您甚至可以在相对路径和绝对路径之间切换
  • 对类似问题的回答建议使用html的基本元素来消除将baseUrl添加到每个templateUrl的需要.但这也影响了网站上的所有其他资源.仅配置模板的基本URL没有副作用

通常,我不使用此解决方案与上面的硬编码值.这只是一个以最简单的方式展示要做什么的例子.为了能够在您的服务器上复制您的应用程序,请在索引文件中定义app.js之外的值,并生成必要的服务器端:

// file: index.php
<?php
  // only depends on your project layout
  $angularPartialsBaseUrl = 'themes/angular/partials/';
  // this will change when you move the app around on the server
  $themeBaseUrl  = $_SERVER['REQUEST_URI'] . 'themes/angular';
?><!DOCTYPE html>
<html ng-app="myApp">
<head>
    <title>Yii Blog Demo</title>

    <script>
      var myNS = myNS || {};
      myNS.appConfig = myNS.appConfig || {};
      myNS.appConfig.templateBaseUrl = '<?php echo $angularPartialsBaseUrl; ?>';
    </script>

    <script src="<?php echo $themeBaseUrl; ?>/js/vendor/angular/angular.js"></script>
    <script src="<?php echo $themeBaseUrl; ?>/js/app.js"></script>

</head>

[...]
Run Code Online (Sandbox Code Playgroud)

在app.js中:

// file: app.js
'use strict';

/* App Module */
angular.module( 'myApp', [] )

  // define the templateBaseUrl using external appConfig
  .constant( 'templateBaseUrl', myNS.appConfig.templateBaseUrl );
Run Code Online (Sandbox Code Playgroud)