【问题标题】:How use shared services with controllers that use no shared services?如何将共享服务与不使用共享服务的控制器一起使用?
【发布时间】:2016-06-15 09:39:17
【问题描述】:

假设有一个模块只有一个工厂(共享服务)。

angular.module('sharedService', [])
    .factory('sharedSrv', sharedService)

function sharedService() {
  var number;

  return {
    getNum: getNumber
  };

  function getNumber() {
    return number;
  }

  function setNumber(i) {
    number = i;
  }
}

我看到我们可以通过将依赖项传递给模块来注入共享服务

angular.module('app', ['sharedService'])
.controller('theCtrl', function(sharedSrv) {
  var self = this;

  self.setSharedNumber = sharedSrv.setNumber;
}

但是,如果控制器使用他自己模块中的服务,如何注入共享服务?

angular.module('app', ['sharedService'])
.controller('theCtrl', theCtrlFun)
.service('theSrv', theSrvFun)

theCtrlFun.$inject = ['theSrv']

function theCtrlFun(localSrv) {
 // How call sharedService ? 
}

function theSrvFun() {
  // Some fantastic features.
}

感谢您的帮助。

【问题讨论】:

    标签: javascript angularjs angularjs-service angularjs-module


    【解决方案1】:

    您不应该将服务模块作为变量注入,您需要将模块名称传递为string

    angular.module('app', [sharedService])
    .controller('theCtrl', function(sharedSrv) {
    

    应该是

    angular.module('app', ['sharedService'])
    .controller('theCtrl', function(sharedSrv) {
    

    或者你可以遵循 DI 的内联数组注释

    angular.module('app', ['sharedService'])
    .controller('theCtrl', ["sharedSrv",  function(sharedSrv) {
        //code here
    }]);
    

    【讨论】:

    • 感谢您的指正。但是在您的最后一个块中,如果此服务位于应用程序的另一个模块中,如何识别“sharedSrv”?
    【解决方案2】:

    从声明 angular.module('app', [sharedService]) 中删除 sharedService,因为您的共享服务不属于此模块。

    您需要在声明 theCtrlFun.$inject = ['theSrv'] 中注入 theSrv 而不是 theSrvFun

    theCtrlFun 函数中只需调用该服务的方法即可。 例如someMethod是在theSrv服务上定义的,你需要这样调用

    theSrv.someMethod(); 
    

    例如

    angular.module('app', [])
        .controller('theCtrl', theCtrlFun)
        .service('theSrv', theSrvFun)
    
    theCtrlFun.$inject = ['theSrv']
    
    function theCtrlFun(localSrv) {
        theSrv.someMethod(); // calll in this way
    }
    
    function theSrvFun() {
        // Some fantastic features.
    }
    

    最好使用Array Annotation 定义DI

    angular.module('app', [])
        .controller('theCtrl', ['theSrv', function(theSrv) {
    
            theSrv.callMe();
    
        }])
        .service('theSrv', function() {
    
            this.callMe = funtion() {
    
    
            }
    
        })
    

    【讨论】:

    • 感谢您的帮助,我在语法上犯了很多错误。但我想同时在同一个控制器中使用 sharedService 和 TheSrv 。 (Srv 将包含仅用于 Ctrl 的工具,但 sharedService 将被其他模块使用)。
    【解决方案3】:

    试试这个:

    angular.module('app', [])
    .controller('theCtrl', theCtrlFun)
    .service('theSrv', theSrvFun)
    
    theCtrlFun.$inject = ['theSrv']
    
    function theCtrlFun(localSrv) {
     // How call sharedService ? 
     console.log(localSrv)
    }
    
    function theSrvFun() {
      // Some fantastic features.
    }
    

    plnkr:http://plnkr.co/edit/lSosJbYfG6tuF4pCXYqR?p=preview

    【讨论】:

    • 谢谢,我犯了错误。但是如果我想在同一个控制器中使用 theSrv 和 sharedService 怎么办?
    • 要使用另一个模块的服务,您需要将该模块注入您的模块,然后将该模块的服务注入您的控制器
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2016-11-05
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多