【发布时间】:2015-10-02 19:29:24
【问题描述】:
我正在开发一个使用公共 API 的 Angular 应用程序。我似乎无法将服务对象传递给控制器。错误是
TypeError: Cannot read property 'searchRole' of undefined
在这一行:
var model = govtracksvc.searchRole();
当我在调试器中单步执行时,它首先访问服务文件。 govtrack 和 govtracksvc 都被创建,并且 govtrack 被注入。然后服务对象在文件末尾死掉,因为当它调用控制器文件时,服务变量是未定义的。当应用程序进入控制器文件时,我缺少使服务对象保持活动状态的链接。任何帮助都将是巨大的。
rep.module.js
(function () {
var angular = require('angular'); //browserify bundling with NPM
angular.module('RepresentativeApp', []);
require('./rep.service.js');
require('./Rep.js');
})();
rep.service.js
var govtracksvc = (function () {
angular
.module('RepresentativeApp')
.factory('govtracksvc', govtracksvc);
var govtrack = require('govtrack-node');
govtracksvc.$inject = ['govtrack'];
function govtracksvc(govtrack) {
var service = { searchRole: searchRole };
return service;
function searchRole(obj) { //do stuff }
}
})();
Rep.js
var Rep = (function () {
angular
.module('RepresentativeApp')
.controller('Rep', [Rep]);
Rep.$inject = ['govtracksvc'];
function Rep(govtracksvc) {
var model = govtracksvc.searchRole();
return model;
}
})();
更新
我还没有深入了解这一点,但我相信这与 browserify 如何捆绑模块有关。我认为 IIFE 是问题的一部分。
【问题讨论】:
-
你为什么使用 $inject?
-
'govtrack' 服务未在您的示例中定义。你不需要做任何事情来保持依赖“活着”。如果注入了,就注入了,如果没有注入,就没有。
-
@YuriZarubin $inject 添加依赖项-对于控制器,依赖项是工厂。对于工厂来说,依赖是 govtrack 对象。
-
@estus govtracksvc 在 rep.service.js 中定义。问题是控制器脚本运行时变量未定义。它注入了一个未定义的“govtracksvc”
-
是的,但你为什么要使用 $inject 呢?定义依赖关系的惯用角度方式就是
.controller(function(yourDependency) { yourDependency.foo() })。为什么将数组表示法与 $inject 一起使用?这很奇怪。
标签: javascript angularjs node.js dependency-injection browserify