Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从不同文件的指令调用工厂?_Javascript_Angularjs_Controller_Factory_Directive - Fatal编程技术网

Javascript 如何从不同文件的指令调用工厂?

Javascript 如何从不同文件的指令调用工厂?,javascript,angularjs,controller,factory,directive,Javascript,Angularjs,Controller,Factory,Directive,我第一次用Angular JS开发,我正在编辑我朋友的应用程序。我会从另一个文件中的指令调用工厂。以下是相关文件的代码: 用户工厂.js (function() { 'use strict'; angular.module('myApp.services').factory('currUserService', function() { var curruser = ''; var self = this; return { setCurrUser:

我第一次用Angular JS开发,我正在编辑我朋友的应用程序。我会从另一个文件中的指令调用工厂。以下是相关文件的代码:

用户工厂.js

(function() {
  'use strict';

  angular.module('myApp.services').factory('currUserService', function() {
    var curruser = '';
    var self = this;
    return {
      setCurrUser: function(user) {
          self.curruser = user;
      },
      getCurrUser: function() {
          return self.curruser;
      },
    }
  });


}());
(function() {
  'use strict';

  angular.module('myApp.directives').directive('mainpageUsersBox', function() {
    return {
      restrict: 'E',
      replace: true,
      scope: {
          users: '=users'
        },
      templateUrl: 'views/templates/mainpage-users-box.directive.html',
      controller: controller,
      controllerAs: 'ctrl'
    };
  });

  function controller($scope) {
    var ctrl = this;

    ctrl.openProfile = function(user) {
      ctrl.currUserService.setCurrUser(user);
    };
  }

  controller.$inject = ['$scope'];

}());
主页用户框.js

(function() {
  'use strict';

  angular.module('myApp.services').factory('currUserService', function() {
    var curruser = '';
    var self = this;
    return {
      setCurrUser: function(user) {
          self.curruser = user;
      },
      getCurrUser: function() {
          return self.curruser;
      },
    }
  });


}());
(function() {
  'use strict';

  angular.module('myApp.directives').directive('mainpageUsersBox', function() {
    return {
      restrict: 'E',
      replace: true,
      scope: {
          users: '=users'
        },
      templateUrl: 'views/templates/mainpage-users-box.directive.html',
      controller: controller,
      controllerAs: 'ctrl'
    };
  });

  function controller($scope) {
    var ctrl = this;

    ctrl.openProfile = function(user) {
      ctrl.currUserService.setCurrUser(user);
    };
  }

  controller.$inject = ['$scope'];

}());
mainpage.html

[...]
<mainpage-users-box users="ctrl.users"></mainpage-users-box>
[...]
[…]
[...]
正如您在第二个文件中看到的,我想使用
.setCurrUser(user)
方法,但我得到了以下错误:类型错误:无法在Chrome控制台中读取未定义的属性“setCurrUser


你能帮我找出原因吗?

看起来你根本没有注入服务:

// Where's the service?  
function controller($scope) {
    var ctrl = this;

    ctrl.openProfile = function(user) {
      ctrl.currUserService.setCurrUser(user);
    };
  }

  // Where's currUserService?
  controller.$inject = ['$scope'];
如果您将控制器改为此,这是否不起作用

function controller(currUserService) {
    var ctrl = this;

    ctrl.openProfile = function(user) {
      ctrl.currUserService.setCurrUser(user);
    };
  }

  controller.$inject = ['currUserService'];

您似乎正在使用编写控制器的
controllerAs
风格。在这种情况下,不需要注入
$scope
,除非添加
$watchs

了解您如何在html中包含这些文件会很有帮助。我添加了
,您可能想看看