Angular.js中的Utils类

时间:2016-08-01 13:24:49

标签: javascript angularjs service

我想在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模块吗?

1 个答案:

答案 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