如何使用服务中的数据更新指令?

时间:2013-12-28 23:39:44

标签: angularjs

假设我有一个服务MyService,它具有属性“data”,其中包含从2或3 $ http请求中检索的内容,并将其存储到“data”中。这个“数据”需要可访问或传递给要处理的指令(如模态)。

服务“MyService”包含myDirective在首次加载时需要处理的属性“data”。

// var app = angular.module...
app.service('MyService',...)

我有一个单独的指令“myDirective”:

var myDirective = angular.module('myDirective', []);
myDirective.directive('control', ['Params', function(Params) {...

我尝试通过执行以下操作注入“MyService”:

var myDirective = angular.module('myDirective', ['MyService']);
myDirective.directive('control', ['Params', function(Params) {...

虽然未能实例化说:

error: [$injector:nomod] Module 'MyService' is not available! You either misspelled the module name or forgot to load it.
If registering a module ensure that you specify the dependencies as the second argument.

如何从myService正确实例化myDirective?这是正确的方法还是应该使用某些控制器/工厂/提供商?

2 个答案:

答案 0 :(得分:1)

您将myService视为不是的模块,它是模块的组件。您只将模块注入其他模块。将所有相关模块注入主模块后,所有模块的组件都可直接用于其他组件,无论它们最初注册到哪个模块。

要注入指令,就像将Params注入指令一样。我怀疑你只是为了创建一个指令而不必要地创建一个新模块。

尝试这种方式:

app.service('MyService',...);
app.directive('control', ['Params','MySerrvice', function(Params,MyService) {...

现在,在指令中,您可以使用MyService.propertyName

访问服务中的对象

答案 1 :(得分:0)

您正在尝试将MyService服务作为模块添加到您的MyDirective模块中,该模块无效。

简单的方法是将指令添加到您的app模块并注入您的服务:

app.directive('control', ['Params', 'MyService', function(Params, MyService) {
   //...
}]);

如果您为指令创建额外的模块,也可能为您的服务创建额外的模块,您必须将这些模块添加到您的应用程序模块中(例如,通常在app.js中):

var directivesModule = angular.module('app.directives', []);
var servicesModule = angular.module('app.services', []);

var app = angular.module('app', ['app.directives', 'app.services']);

然后将您的服务和指令添加到相应的模块中:

servicesModule.service('MyService',...);

directivesModule.directive('control', ['Params','MyService', function(Params, MyService) {
    //...
}]);

为每个服务/指令创建一个文件,或为所有服务创建一个文件,为所有指令创建一个文件。取决于您的应用程序的大小。