AngularJS Controller作为服务器或服务作为控制器

时间:2017-06-28 12:10:54

标签: javascript angularjs angularjs-service angularjs-controller

在创建仪表板应用程序时,我遇到了需要同时拥有AngularJS控制器和服务的情况。

在主(第一)页面,我mainController(布局无),layoutController与方法loadLayoutFromAPI()saveLayoutToAPI()绑定到按钮。

现在,在辅助(第二),只有secondController而不是layoutController。我需要直接从layoutController使用secondController中的方法,我不希望在HTML中插入ng-controller指令(而是通过依赖注入将其放入secondController )。

MainPage(1st):

<div ng-controller="mainController">
    <!-- some other code -->

    <div ng-controller="layoutController as ctrl">
        <a href="#" ng-click="ctrl.loadLayoutFromAPI()">Load</a>
        <a href="#" ng-click="ctrl.saveLayoutToAPI()">Save</a>
    </div>
</div>

SecondaryPage(2nd):

<div ng-controller="secondController">
    <!-- some other code -->
</div>

我试图寻找这个问题,但根本找不到答案。

问题:我应该如何使用同一段代码(方法save()load())作为控制器(ng-controller),其他时间作为服务(包括在dependency-injection)?

由于

JS Bin根据要求

2 个答案:

答案 0 :(得分:5)

不要直接从其他控制器使用其他控制器的方法......这就是服务的原因。控制器只能与视图互动!

如果您想在控制器,指令或其他任何服务,工厂和提供商所需的内容之间进行通信。在构建任何应用程序时,您总是将常用功能抽象为某种服务

例如:

//Just an APP def
var app = angular.module('dashApp', []);

//LayoutController
app
  .controller('layoutController', ['CtrlService', function(ctrlService){
  this.saveLayoutToAPI = function(){
    ctrlService.save();
  }
  this.loadLayoutFromAPI = function(){
    ctrlService.load();
  }
}]);

//Main Controller
app
  .controller('mainController', function(){
  //no work with layout at all
});

//Secondary controller

app
  .controller('secondController', ['CtrlService', function(ctrlService){
  this.save = function(){
     ctrlService.save();
  }
  this.load = function(){
     ctrlService.load();
  }
}]);

app
  .service('CtrlService', function () {  

    var obj = {
      save: function () {
        console.log('Layout saved.');
      },
      load: function () {
        console.log('Layout loaded.');
      }
    }

    this.save = obj.save;
    this.load = obj.load;
  });

答案 1 :(得分:1)

您可以使用$ broadcast来实现此目的。

下面是解释这个概念的图表。

enter image description here

controller-2中的示例代码

$rootScope.$broadcast('saveCalled');

controller-1

中的示例代码
 $scope.$on('saveCalled',function(){
       saveLayoutToApi();
    })