AngularJS - 您可以在不修改其核心源的情况下重命名服务吗?

时间:2014-08-01 08:22:06

标签: angularjs

我有一种情况,我已经为angular.js下载了一个书面服务,但它运行正常 - 但我希望在代码中调用一些不同的东西只是为了方便和可读性。这不是一个真正的要求,只是一种愿望。

我可以在服务的实际源代码中进行更改,但这显然会导致各种问题。所以我想知道,这种事情有可能吗?你可以别名'您的应用程序中的服务,以便在您通过控制器传递它时可以使用不同的服务?例如......

正常​​

var app = angular.module('demo', [ 'ngSomethingLongAndObtuseThatIsNotNecessary' ]);

app.controller('HomeController', function(ngSomethingLongAndObtuseThatIsNotNecessary){
   ngSomethingLongAndObtuseThatIsNotNecessary.open();
});

目标

var app = angular.module('demo', [ 'ngSomethingLongAndObtuseThatIsNotNecessary' ]);
var smallerName = ngSomethingLongAndObtuseThatIsNotNecessary;

app.controller('HomeController', function(smallerName){
   smallerName.open();
});

我尝试过这样做,将它分配给另一个变量,但它没有用。

更新

我确实做了某事工作,但我不确定这是否会产生不良后果。

var app = angular.module('demo', [ 'ngSomethingLongAndObtuseThatIsNotNecessary' ]);

app.service('ngSmaller', function(ngSomethingLongAndObtuseThatIsNotNecessary) {
   return ngSomethingLongAndObtuseThatIsNotNecessary;
});

app.controller('HomeController', function(ngSmaller){
   ngSmaller.open();
});

3 个答案:

答案 0 :(得分:3)

你可以像这样注入它,这样服务名称作为数组中的字符串将被解析为函数中的属性名称,ORDER很重要

app.controller('HomeController', ['ngSomethingLongAndObtuseThatIsNotNecessary', function(shortName){
   shortName.open();
}]);

---编辑-----

或使用注射器

var injector = angular.injector(['demo', 'ng']);
var shortName = injector.get('ngSomethingLongAndObtuseThatIsNotNecessary');

app.controller('HomeController', function(shortName){
  shortName.open();
});

答案 1 :(得分:2)

您可以使用别名重新定义服务,然后在应用程序的任何位置使用它。即使您使用长名称,它甚至会保持相同的一个实例:

app.service("shortName", ["ngSomethingLongAndObtuseThatIsNotNecessary", function (originalService) { return originalService; }]);

app.controller("HomeController", ["shortName", function(service) {
   service.open();
}]);

同样,您可以为整个模块添加别名:

angular.module("shortModuleName", ["veryVeryLoooooooooooooooooooongModuleName"]);

答案 2 :(得分:2)

另一种方法可以是创建一个名称较小但使用现有服务功能的新工厂。可能有助于实现您的需求而不会污染全局命名空间。

angular.module('myApp').factory('simpleService',['IHaveAVeryLongOrConfusingName', function(foo){
  return foo;
}])