【问题标题】:function is undefined error in angular controller角度控制器中的函数是未定义的错误
【发布时间】:2015-04-19 04:13:06
【问题描述】:

我在尝试使用 angularjs 中的工厂和控制器设置一个相当简单的调用时遇到了问题。我一直在尝试按照 John Papa 和 Todd Motto 的风格指南进行设置。

首先我使用 2 个模块

(function(){

 'use strict';

  angular.module('app',[

  'app.core',
  'app.property'

     ]);
})();

在 'app.core' 我定义了工厂

(function(){

'use strict';

angular.module('app.core')
  .factory('dataservice',dataservice);

dataservice.$inject = ['$http','$q'];

function dataservice($http,$q) {

 var service = {
    getListing: getListing
 };

 return service;


 function getListing() {

      var def = $q.defer;

      $http.get("http://acme.com/property/1?format=json")
        .success(function(data){
          service.getListing = data;
          def.resolve(data);
        });

      return def.promise;


 }
}
})();

在“app.property”中我定义了控制器

 (function(){

  'use strict';

  angular.module('app.property')
    .controller('PropertyCtrl',PropertyCtrl);

  PropertyCtrl.$inject = ['dataservice'];

  function PropertyCtrl(dataservice) {

  var vm = this;
  vm.listings = [];

  activate();

  function activate() {
    return getListing().then(function(){});
  }
  function getListing(){
    return dataservice.getListing().then(function(data){
      vm.listings = data;
      console.log("data is");
      console.log(data);
      return vm.listings;
    });
  }
  }
})();

我在控制台输出中得到的错误是

错误:dataservice.getListing(...) 未定义,除非我在 chrome 中检查数据服务时可以看到

我收到的进一步消息

TypeError: Cannot read property 'then' of undefined

TypeError: def.resolve is not a function

尽管有这些错误,远程调用仍能正常返回 json。

希望有棱角的人知道我哪里出错了。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    你很亲密。应该是$q.defer(),但你有$q.defer

     function getListing() {
          var def = $q.defer();
          $http.get("http://acme.com/property/1?format=json")
            .success(function(data){
              service.getListing = data;
              def.resolve(data);
            });
          return def.promise;   
     }
    

    【讨论】:

    • 投反对票的人也会评论原因,以便我改进。
    • 我没有否决它,但我认为这不是 OP 问题。可能是他的代码有A问题,但我认为这不是他提到的错误的原因。
    • 如果您能看到 OP 出现的错误,Cannot read property 'then' of undefined 与延迟有关。但是在数据服务中 getlisting() 是可用的。所以很明显是因为这个
    • 是的,你的权利! +up-vote 在第一个错误解决后我停止了。我也更新了我的 plunker 以反映您的更正。他有多个问题。
    【解决方案2】:

    您必须实际创建要构建的模块:

    把它放在你的app.property 模块的对象之上: angular.module('app.property', []);

    把它放在你的app.core 模块的对象之上: angular.module('app.core', []);

    您基本上是将工厂和控制器附加到不存在的模块上。您正在尝试将不存在的模块注入主模块。

    这是一个 plunker,显示了您已解决的问题。您的代码还有一些其他问题,但至少它现在找到了模块,这是您最初的问题。

    还应该注意的是,mohamedrias 也是正确的 - 您在 defer 调用中没有输入 () 是语法错误。 我更新了我的 plunker 以包括他的更正。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多