我想在Angular.js中创建一个可供多个控制器使用的实用程序类。
到目前为止,我创建了这个:
'use strict';
angular
.module('App')
.factory('AppUtils', AppUtils);
function AppUtils() {
var vm = this;
vm.getPersonOf = getPersonOf;
function getPersonOf(personId, allPersons) {
var person = {};
person.personId = {personId: personId};
allPersons.forEach(function(p) {
if (p.personId === personId) {
person = p;
}
});
return person;
}
}
我尝试在这样的控制器中使用它:
'use strict';
angular
.module('App')
.controller('AppController', AppController);
function AppController(personId, allPersons, AppUtils) {
var vm = this;
vm.personId = personId;
vm.person = AppUtils.getPersonOf(vm.personId, allPersons);
...
}
但我明白了:
PhantomJS 1.9.8(Windows 7 0.0.0)App应该忽略模式失败 错误:[$ injector:undef]提供商' AppUtils'必须从$ get factory方法返回一个值。 http://errors.angularjs.org/1.5.0/ $注射器/是undef?P0 = InvoiceUnitsUtils
(真实姓名已重命名,以便更容易。)
为什么我会收到该错误?我没有正确宣布Utility模块吗?
答案 0 :(得分:1)
工厂负责创建服务并将其实例交给您。为此,您需要返回实用程序类:
function AppUtils() {
return {
getPersonOf: getPersonOf
// pass other utility functions...
}
function getPersonOf(personId, allPersons) {
var person = {};
person.personId = {personId: personId};
allPersons.forEach(function(p) {
if (p.personId === personId) {
person = p;
}
});
return person;
}
}
我删除了vm
部分因为我们正在处理一个通常没有视图模型的服务(控制器负责这个,服务更像是一个业务逻辑专家)。
以下是有关Angular提供程序中$get
函数的更多信息:
https://docs.angularjs.org/guide/providers