函数是角度控制器中的未定义错误

时间:2015-04-19 04:13:06

标签: angularjs

我在尝试使用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中的dataservice,我可以看到enter image description here

我还收到了

TypeError: Cannot read property 'then' of undefined

TypeError: def.resolve is not a function

尽管有这些错误,远程调用返回json罚款。

希望有角度排骨的人知道我哪里出错了。

2 个答案:

答案 0 :(得分:1)

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

将其放在app.property模块的对象上方: angular.module('app.property', []);

将其放在app.core模块的对象上方: angular.module('app.core', []);

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

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

还应该注意的是,mohamedrias也是正确的 - 你没有在你的延迟电话上放()语法时出现错误。 我更新了我的plunker以包括他的纠正。

答案 1 :(得分: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;   
 }