如何使用 AngularJS 为 HTTP 调用和图像加载设置基础 URL

How to set a base URL for HTTP calls and image loading with AngularJS

我一直在寻找,到目前为止我找不到处理以下情况的方法:

我想要一个代表我的域的变量,例如 http://example.com/myserver/。我想要访问的任何内容都位于该域中。这样的变量应该在所有 Services 以及 HTML 中对我可用(用于图像加载目的)。例如:

angular.module('App', ['App.providers', 'App.services', 'App.controllers', 'App.directives']).run('EndpointFactory', [function (EndpointFactory) {
    EndpointFactory.BASE = 'http://www.example.com/mydata';
}]);

angular.module('App.services', []).factory('PrizeService', ['$http', 'EndpointFactory', function ($http, EndpointFactory) {
    return {
        index: function () {
            return $http.post(EndpointFactory.BASE + '/prizes', {});
        }
    };
}]);

上面的这个例子是我失败的尝试之一。虽然我不喜欢必须在每个服务中注入工厂的想法,但我愿意这样做,直到我遇到 <img ng-src /> 标签。

<div>
   <img ng-src="{{EndpointFactory.BASE + prize.imagePath}}" />
</div>

我无法从此指令访问 EndpointFactory,我不想将数据从工厂复制到每个控制器中的 $scope

您可以使用 constants。观察以下...

module.constant('BASE', 'http://example.com/myserver/');

然后可以将此值注入任何地方,例如

module.factory('PrizeService', ['$http', 'BASE', function ($http, BASE) {
    console.log(BASE) // -- http://example.com/myserver/
    /*...*/
}]);

对于模板,您可以随时将其放在 run 块中的 $rootScope 上,以便在任何地方参考...

module.run(['$rootScope' , 'BASE', function($rootScope, BASE) {
    $rootScope.base = BASE;
}]);

<img ng-src="{{ base + prize.imagePath }}" />

或者,您当然可以将此常量注入并分配给与 $rootScope 相反的各个范围,但这听起来像是一个全局值,可能是一个合适的选择。

JSFiddle Link - 展示 $rootScope 和出厂值注入的演示

这是一个

示例 Angular 6(我不确定它是否适用于 AngularJs)

与您想要的相关,我发现这是最干净的方式。我希望这对您有意义并节省您一些时间。祝你好运!

在共享文件夹中创建一个名为 baseurl.ts 的新文件并更新其内容如下:

export const baseURL = 'http://localhost:3000/';

打开 AppModule,导入 baseURL 并更新 @NgModule 装饰器的 AppModule 提供者 属性 如下:

. . .
import { baseURL } from './shared/baseurl';


. . .


providers: [

  . . .

  {provide: 'BaseURL', useValue: baseURL}
  ]

正在更新菜单组件 打开menu.component.ts并更新如下:

import { Component, OnInit, Inject } from '@angular/core';

. . .

  constructor(private dishService: DishService,
    @Inject('BaseURL') private BaseURL) { }
    
. . .

打开menu.component.html并更新如下:

. . .
        <img height="200px" src="{{BaseURL + dish.image}}" alt={{dish.name}}>

. . .

[参考] 这个例子来自Coursera.com https://www.coursera.org/learn/angular/lecture/Mgo5H/exercise-video-angular-http-client