2

如果我在某个自定义位置托管一个角度应用程序,e.g. http://localhost/collosys那么我必须将所有 ng-include 更改为所有地址都具有“/collosys/”,因为我使用绝对地址来引用任何 html 文件。

这就是我目前正在做的事情

<script>
    var baseUrl = document.location.pathname;
    document.write('<base href="' + document.location.pathname + '" />');
</script>

然后在重写 ng-include 标记

FROM: <div data-ng-include="'/Generic/csgrid/grid-buttons.html'"></div>
TO: <div data-ng-include=" baseUrl + 'Generic/csgrid/grid-buttons.html'"></div>

我可以修改 ng-include 标记本身,以便它可以在所有地址前面加上托管地址

编辑

我在某处读到 angularjs 指令是可扩展的,任何关于如何扩展 angularjs ngInclude 指令的示例?有什么例子吗??

4

4 回答 4

4

我使用 $httpProvider.interceptors 解决了这个问题。以下将“myAppDirectory”添加到所有请求。

$httpProvider.interceptors.push(function($q) {
    return {
     'request': function(config) {
         config.url = 'myAppDirectory/'+config.url;
         return config;
      },
    };
  });

一个常规的 ng-include,例如:

<div ng-include="'user/info.html'">

将加载myAppDirectory /user/info.html

你可能想要做一些例外。就我而言:

  $httpProvider.interceptors.push(function() {
    return {
     'request': function(config) {
         // ignore api calls and ui-bootstrap templates.
         if (config.url.indexOf('api')==-1 && config.url.indexOf('template')==-1) {
           config.url = 'myAppDirectory/'+config.url;
         }
         return config;
      },
    };
  });
于 2014-09-25T20:20:44.323 回答
2

如前所述,您有几个选项:

  1. 更改 Angular 源代码(也称为猴子补丁) - 不推荐,需要高维护并使您的代码对其他人不可读。

  2. 使用装饰器,它允许您获取 ngInclude 指令并对其进行更改。装饰器通常用于扩展\更改 3rd 方库,但缺点是您必须替换 ngInclude 的整个编译功能,大约 60 行以换取一点前缀。更不用说如果 Angular 改变了 ngInclude 的工作方式,您将使用它的已弃用或损坏的版本。

  3. 编写您自己的包装指令,该指令将调用 ngInclude。从现在开始,您将拥有 myInclude:

    angular.module('myApp').directive('myInclude', [function () {
        var baseUrl = 'collosys';
        return {
            replace: true,
            scope: {
                myInclude: '@'
            },
            template: '<div ng-include="' + baseUrl + '{{myInclude}}"></div>'
        };
    }]);
    
于 2014-05-01T21:03:29.983 回答
0

修改head标记中的标签:

<head>
  <base href="collosys" />
</head>
于 2014-05-01T18:06:15.083 回答
0

是的,你可以,但我会编写自己的 ng-include。如果您尝试升级 Angular,您将简单地覆盖您的更改。

于 2014-05-01T17:53:14.920 回答