Angular ui-router получает асинхронные данные с разрешением
Я хочу отобразить форму с данными, соответствующими отредактированному элементу. Я использую ui-router
для маршрутизации. Я определил состояние:
myapp.config(function($stateProvider) {
$stateProvider.
.state('layout.propertyedit', {
url: "/properties/:propertyId",
views : {
"[email protected]": {
templateUrl : 'partials/content2.html',
controller: 'PropertyController'
}
}
});
В PropertyController
я хочу установить $scope.property
с данными, поступающими со следующего вызова (конечные точки Google Cloud):
gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
Я не знаю, могу ли я использовать resolve
, потому что данные возвращаются асинхронно. Я попробовал
resolve: {
propertyData: function() {
return gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
}
}
Первая проблема, propertyId
- undefined. Как вы получаете propertyId
из url: "/properties/:propertyId"
?
В основном я хочу установить $scope.property
в PropertyController
в объект resp
, возвращенный асинхронным вызовом.
EDIT:
myapp.controller('PropertyController', function($scope, , $stateParams, $q) {
$scope.property = {};
$scope.create = function(property) {
}
$scope.update = function(property) {
}
function loadData() {
var deferred = $q.defer();
gapi.client.realestate.get({'id': '11'}).execute(function(resp) {
deferred.resolve(resp);
});
$scope.property = deferred.promise;
}
});
Ответы
Ответ 1
Вам нужно прочитать документы для решения. Разрешающие функции инъектируются, и вы можете использовать $stateParams
для получения правильного значения из ваших маршрутов, например:
resolve: {
propertyData: function($stateParams, $q) {
// The gapi.client.realestate object should really be wrapped in an
// injectable service for testability...
var deferred = $q.defer();
gapi.client.realestate.get($stateParams.propertyId).execute(function(r) {
deferred.resolve(r);
});
return deferred.promise;
}
}
Наконец, значения для функций разрешения впрыскиваются в ваш контроллер после разрешения:
myapp.controller('PropertyController', function($scope, propertyData) {
$scope.property = propertyData;
});
Ответ 2
Я думаю, что вашей функции контроллера нужен параметр $stateParams
, из которого вы можете получить свой propertyId
. Затем вы можете использовать параметр $q
и создать обещание установить $scope.property
примерно так:
var deferred = $q.defer();
gapi.client.realestate.get(propertyId).execute(function(resp) {
deferred.resolve(resp);
});
$scope.property=deferred.promise;
Ниже приведено описание описания использования promises для обработки асинхронных вызовов.
Ответ 3
Попробуйте этот простой способ правильно использовать решение
Код состояния:
.state('yourstate', {
url: '/demo/action/:id',
templateUrl: './view/demo.html',
resolve:{
actionData: function(actionData, $q, $stateParams, $http){
return actionData.actionDataJson($stateParams.id);
}
},
controller: "DemoController",
controllerAs : "DemoCtrl"
})
В приведенном выше коде я отправляю данные параметров, которые я отправляю в URL-адрес. Например, если я отправляю как это /demo/action/5
это число 5 перейдет в сервис actionData
, который служба получит некоторые json-данные на основе id.Наконец, что данные будут храниться в actionData
Вы можете использовать это в своем контроллере напрямую, используя это имя
Следующий код возвращает некоторые данные JSON на основе идентификатора, который передается на уровне состояния
(function retriveDemoJsonData(){
angular.module('yourModuleName').factory('actionData', function ($q, $http) {
var data={};
data.actionDataJson = function(id){
//The original business logic will apply based on URL Param ID
var defObj = $q.defer();
$http.get('demodata.json')
.then(function(res){
defObj.resolve(res.data[0]);
});
return defObj.promise;
}
return data;
});
})();
Ответ 4
Как насчет этого:
function PropertyController($scope, $stateParams) {
gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) {
$scope.property = resp;
});
}