我在尝试使用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,我可以看到
我还收到了
TypeError: Cannot read property 'then' of undefined
TypeError: def.resolve is not a function
尽管有这些错误,远程调用返回json罚款。
希望有角度排骨的人知道我哪里出错了。
答案 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;
}