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

Javascript 如何使用AngularJS为HTTP调用和图像加载设置基本URL,javascript,html,angularjs,angularjs-scope,angularjs-factory,Javascript,Html,Angularjs,Angularjs Scope,Angularjs Factory,我一直在搜索,但到目前为止,我找不到处理以下情况的方法: 我想要一个代表我的域的变量,比如http://example.com/myserver/。我想访问的任何内容都将在该域中进行子定位。这种变量应该可以在所有服务中使用,也可以从HTML中使用(用于图像加载)。例如: angular.module('App', ['App.providers', 'App.services', 'App.controllers', 'App.directives']).run('EndpointFactory

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

我想要一个代表我的域的变量,比如
http://example.com/myserver/
。我想访问的任何内容都将在该域中进行子定位。这种变量应该可以在所有
服务中使用,也可以从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', {});
        }
    };
}]);
上面这个例子是我失败的试验之一。虽然我不喜欢每次服务都必须注入工厂的想法,但我愿意这样做,直到我面对
标签

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

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

您可以使用。注意以下几点

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;
}]);


或者,您当然可以将该常量注入并分配给各个作用域,而不是
$rootScope
,但这听起来像一个全局值,可能是一个合适的匹配

-演示了
$rootScope
和工厂价值注入

Angular6示例(我不确定它是否适用于AngularJs) 与你想要的有关,我发现这是最干净的方式。我希望这对你有意义,并为你节省一些时间。祝你好运

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

export const baseURL = 'http://localhost:3000/';
. . .
import { baseURL } from './shared/baseurl';


. . .


providers: [

  . . .

  {provide: 'BaseURL', useValue: baseURL}
  ]
import { Component, OnInit, Inject } from '@angular/core';

. . .

  constructor(private dishService: DishService,
    @Inject('BaseURL') private BaseURL) { }
    
. . .
. . .
        <img height="200px" src="{{BaseURL + dish.image}}" alt={{dish.name}}>

. . .
打开AppModule,导入baseURL并更新@NgModule装饰器的AppModule的providers属性,如下所示:

export const baseURL = 'http://localhost:3000/';
. . .
import { baseURL } from './shared/baseurl';


. . .


providers: [

  . . .

  {provide: 'BaseURL', useValue: baseURL}
  ]
import { Component, OnInit, Inject } from '@angular/core';

. . .

  constructor(private dishService: DishService,
    @Inject('BaseURL') private BaseURL) { }
    
. . .
. . .
        <img height="200px" src="{{BaseURL + dish.image}}" alt={{dish.name}}>

. . .
更新菜单组件 打开menu.component.ts并按如下方式进行更新:

export const baseURL = 'http://localhost:3000/';
. . .
import { baseURL } from './shared/baseurl';


. . .


providers: [

  . . .

  {provide: 'BaseURL', useValue: baseURL}
  ]
import { Component, OnInit, Inject } from '@angular/core';

. . .

  constructor(private dishService: DishService,
    @Inject('BaseURL') private BaseURL) { }
    
. . .
. . .
        <img height="200px" src="{{BaseURL + dish.image}}" alt={{dish.name}}>

. . .
打开menu.component.html并按如下方式进行更新:

export const baseURL = 'http://localhost:3000/';
. . .
import { baseURL } from './shared/baseurl';


. . .


providers: [

  . . .

  {provide: 'BaseURL', useValue: baseURL}
  ]
import { Component, OnInit, Inject } from '@angular/core';

. . .

  constructor(private dishService: DishService,
    @Inject('BaseURL') private BaseURL) { }
    
. . .
. . .
        <img height="200px" src="{{BaseURL + dish.image}}" alt={{dish.name}}>

. . .
。
. . .
[参考] 这个例子来自Coursera.com