![](/img/trans.png)
[英]Error "TypeError: Cannot read property 'email' of undefined" using AngularJS and Ionic
[英]Angularjs/Ionic TypeError: Cannot read property 'then' of undefined
代碼:js:
angular.module('starter.services', ['ngResource'])
.factory('GetMainMenu',['$http','$q','$cacheFactory',function($http,$q,$cacheFactory) {
var methodStr = 'JSONP';
var urlStr = 'http://localhost/bd/wp-admin/admin-ajax.php';
var ptStr = {action:'bd_get_main_menus',callback:'JSON_CALLBACK'};
return {
getMainMenuItems: function(){
var deferred = $q.defer();
$http.jsonp(urlStr,{params: ptStr})
.success(function (data, status) {
deferred.resolve(data);
return deferred.promise;
})
.error(function (data, status) {
deferred.reject(data);
return deferred.promise;
});
}
}
}])
angular.module('starter.controllers', [])
.controller('AppCtrl', function($scope, $ionicModal, $timeout, $http,GetMainMenu) {
GetMainMenu.getMainMenuItems().then(
function(data){
$scope.mainMenus = data;
});
});
運行結果:
TypeError:無法在調用時讀取未定義的屬性'then'(ht ... / www / js / controllers.js:42:33)(ht ... / www / lib / ionic / js / ionic.bundle。 JS:11994:17)...
這些代碼哪里錯了?
您需要從getMainMenuItems函數而不是在用於$http.jsonp
的回調函數中返回deferred.promise
。 這是因為getMainMenuItems
需要返回一個promise。
angular.module('starter.services', ['ngResource'])
.factory('GetMainMenu',['$http','$q','$cacheFactory',function($http,$q,$cacheFactory) {
var methodStr = 'JSONP';
var urlStr = 'http://localhost/bd/wp-admin/admin-ajax.php';
var ptStr = {action:'bd_get_main_menus',callback:'JSON_CALLBACK'};
return {
getMainMenuItems: function(){
var deferred = $q.defer();
$http.jsonp(urlStr,{params: ptStr})
.success(function (data, status) {
deferred.resolve(data);
})
.error(function (data, status) {
deferred.reject(data);
});
return deferred.promise;
}
}
}])
另一種選擇是從$http.jsonp
返回承諾:
return {
getMainMenuItems: function(){
return $http.jsonp(urlStr,{params: ptStr});
};
你應該在$ http之外返回promise對象。 你也可以返回$ http,因為是一個承諾,沒有必要有另一個承諾。
angular.module('starter.services', ['ngResource'])
.factory('GetMainMenu', ['$http', '$q', '$cacheFactory', function ($http, $q, $cacheFactory) {
var methodStr = 'JSONP';
var urlStr = 'http://localhost/bd/wp-admin/admin-ajax.php';
var ptStr = {action: 'bd_get_main_menus', callback: 'JSON_CALLBACK'};
return {
getMainMenuItems: function () {
var deferred = $q.defer();
$http.jsonp(urlStr, {params: ptStr})
.success(function (data, status) {
deferred.resolve(data);
})
.error(function (data, status) {
deferred.reject(data);
});
return deferred.promise
}
}
}])
angular.module('starter.controllers', [])
.controller('AppCtrl', function ($scope, $ionicModal, $timeout, $http, GetMainMenu) {
GetMainMenu.getMainMenuItems().then(
function (data) {
$scope.mainMenus = data;
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.