【问题标题】:AngularJS - controller and factory - where am I going wrong at include/inject functions?AngularJS - 控制器和工厂 - 我在包含/注入功能哪里出错了?
【发布时间】:2016-07-12 12:29:14
【问题描述】:

我是 Angular 新手,无法确定我哪里出错了。我只是想简单地将我的工厂注入我的控制器,参考资料说:“无法读取未定义的属性'validar'”。我有两个文件,ServiceUtil.js 有一个服务,CentroCustoCtrl.js 我正在尝试使用服务的功能。

ServiceUtil.js 中的函数:

 (function () {
  'use strict';

  angular.module('Services', [])
  .service('ValidarFormulario', [function () {

      this.validar = function (form) {
          var valido = true;
         //code
          }
          return valido;
      }
  }]);

})();

还有 CentroCustoCtrl.js

(function () {
 'use strict';

var app = angular.module("start", ['AxelSoft', 'ngLocalize',
       'ngLocalize.Config', 'mvComponentes','Services'])
       .value('localeConf', {
               basePath: '../Scripts/Locales', ...
 ...
 });
 app.controller('CentroCustoCtrl', ['$scope', '$http', 'ValidarFormulario', function ($scope, $http, $rootScope, $timeout, ValidarFormulario) {
   $scope.Salvar = function () {
    if (ValidarFormulario.validar(document.getElementsByTagName('input'))) { ...// Cannot read property 'validar' of undefined

  );

我尝试过 factory ,但也没有用:

angular.module('Services', [])
.factory('ValidarFormulario', [function () {

    return{
        validar : function (form) {
            var valido = true;
           //code
                }
            }
            return valido;
          }
      }
   }]);

})();

感谢您提供的任何帮助。

【问题讨论】:

  • 在使用 ValidarFormulario 时删除此关键字
  • @VinitSolanki 在为服务添加功能时,this 关键字是正确的..
  • 是的,你是对的 pankaj,这就是我给你投票的原因。

标签: javascript angularjs dependency-injection angularjs-scope angularjs-service


【解决方案1】:

问题是你在 DI 内联数组中有错误的依赖序列,基本上它们的数量和序列不匹配

app.controller('CentroCustoCtrl', ['$scope', '$http', 'ValidarFormulario',
    //removed $rootScope, $timeout which wasn't used.
    function ($scope, $http, ValidarFormulario) {

或者,无论哪种方式,您都可以在数组中添加依赖项,如果它们真的要在控制器中使用,如下所示

app.controller('CentroCustoCtrl', ['$scope','$http','$rootScope','$timeout','ValidarFormulario', 
    function ($scope, $http, $rootScope, $timeout, ValidarFormulario) {

【讨论】:

  • 谢谢@PankajParkar,第一个解决方案效果很好。干得好。
  • @EduardoAndrade 理想情况下两者都应该工作..很高兴知道..谢谢 :-) 如果确实解决了您的问题,请接受答案。
【解决方案2】:

当你设置一个模块时,语法是:

angular.module('Services', [ here injections ])

但是当你得到一个模块来使用它时,语法必须是:

angular.module('Services')

【讨论】:

    【解决方案3】:

    只需更改以下代码行

    app.controller('CentroCustoCtrl', ['$scope', '$http', 'ValidarFormulario', function ($scope, $http, $rootScope, $timeout, ValidarFormulario) {
    

    app.controller('CentroCustoCtrl', ['$scope', '$http', '$rootScope', '$timeout',  'ValidarFormulario', function ($scope, $http, $rootScope, $timeout, ValidarFormulario) {
    

    这应该可行。

    【讨论】:

    • 在 15-20 分钟后添加与其他内容相同的答案,没有意义..
    • 欢迎您@Eduardo Andrade。如果您觉得它们有用,请点赞。
    • 你是对的。我在手机上,答案没有刷新,很抱歉。
    【解决方案4】:

    嗯,我也看到你的控制器注入是错误的。你有:

    App.controller('CentroCustoCtrl', ['$scope', '$http', 'ValidarFormulario', function ($scope, $http, $rootScope, $timeout, ValidarFormulario)
    

    你应该有:

    app.controller('CentroCustoCtrl', ['$scope', '$http', '$rootScope', '$timeout', 'ValidarFormulario', function ($scope, $http, $rootScope,$timeout, ValidarFormulario)
    

    “[ ]”上的注入器必须与函数参数匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多