angularjs如何从控制器传递参数到命名函数

时间:2016-07-01 17:03:19

标签: javascript jquery angularjs

在控制器内部我试图将我的代码分解为命名函数以提高可读性。但是,在参数化的命名函数中,作用域和注入的依赖项都是null。如何在命名函数中访问它们。谢谢你的帮助。

(
  function() {
    'use strict';

    var moduleName = 'ufsrAppModule';
    var controllerName = 'ufsrController';
    var dependencyInjection = ['api', 'appHost', 'userAccount', 'userProfileFactory', 'fsrFactory', 'userFsrFactory', internalFunc];

    angular.module(moduleName)
      .controller(controllerName, dependencyInjection);

    function internalFunc(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory) {

      var vm = this; //controller AS in ng-controller, do not use $scope

      init(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory, vm);
    }

    function init(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory, vm) {

      vm.facilityChanged = facilityChanged;

      ...
      ...

      function facilityChanged(vm, fsrFactory) {
        /*update UI then retrieve services*/
        vm.postStatus = undefined;
        vm.services = undefined;
        vm.roles = undefined;
        vm.services = fsrFactory.service().query({
            /*parameters*/
            FacilityID: vm.facility
          })
          .$promise.then(
            function(data) {
              vm.services = data;
            });
      }
    }
  })();

2 个答案:

答案 0 :(得分:0)

严格的DI可以用这种风格单独完成

angular.module(moduleName)
      .controller(controllerName, controllerFunction);

controllerFunction.$inject = ['$scope', '$http'];

function controllerFunction($scope, $http) {
  ...
}

John Papa's Angular style guide也建议使用此样式。

答案 1 :(得分:0)

facilityChanged无效,因为其参数会覆盖传递给init

的参数

可以通过更改

来修复
function facilityChanged(vm, fsrFactory) {

function facilityChanged() {

修改:附加jsbin

我强烈建议将init函数放在控制器函数中以保存参数传递,就像John Papa指南中的activate函数一样。

精制jsbin