如何在AngularJS ng-click(或ng-change,...)中调用服务功能?

Sle*_*nee 18 javascript service angularjs

调用这样的函数时:

HTML:

<select ng-model="var" ng-change="myFunction(var)">
  <option ng-repeat="option in alloptions">{{option}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)

JS:

$scope.myFunction = function(){//do things}
Run Code Online (Sandbox Code Playgroud)

这一切都很完美但是当我的功能在服务中时(控制器可以到达),该功能不会被调用.通过将服务名称作为前缀来调用它也不是一个选项(即使这在javascript代码本身中有效)myService.myFunction(var)

所以我的问题是:当服务位于服务中时,在ng-change中调用服务的正确方法是什么?

提前致谢

Nis*_*air 29

您需要使用范围内的函数来调用服务函数.因此,在您的示例中,只要将服务注入控制器,就可以在作用域的myfunction方法中调用服务方法.

$scope.myFunction = function(var){

   myService.myFunction(var);    
}
Run Code Online (Sandbox Code Playgroud)

永远记住,只有在$ scope中定义的属性才可用于UI,而不是您的服务.

  • 服务并不意味着节省空间.它们是应用程序中的单例实例,可以被其他控制器,服务等访问.我们的想法是将视图与其他JS代码分开.只有需要公开给UI的函数/变量才会添加到$ scope. (8认同)
  • 这工作谢谢.但是,如果你需要在控制器中创建一个函数,那么有一个服务有什么意义呢?几乎没有节省空间? (2认同)

Mat*_*Way 15

虽然Whizkids的回答在技术上是正确的,但我没有看到通过将整个服务直接附加到范围而将整个服务暴露给视图的问题.但是,这取决于项目的复杂性和服务的设计.

例如,与我编写的可重用视图状态相关的大多数服务只是一组函数,其中一个公开底层数据.

return {
    getData: function() { return container; },
    doSomethingOnData: function() { /* some manipulation of container */ }
};
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过将其简单地附加到$scope变量来访问服务数据:

$scope.serviceData = MyService.getData();
Run Code Online (Sandbox Code Playgroud)

因此,访问服务函数的选项要么与Whizkids一起回答并创建附加到范围的包装函数,要么直接将服务公开给视图.

$scope.$MyService = MyService;
Run Code Online (Sandbox Code Playgroud)

您可以做以下事情:

<div ng-click="$MyService.doSomethingOnData()"></div>
Run Code Online (Sandbox Code Playgroud)

虽然这种做法严格违背了角度分离原则,但如果您需要使用简单包装器公开服务中的许多函数,它确实使代码简洁.