Я переношу свой код Angular 1.x, чтобы использовать более новый, более предпочтительный синтаксис, чтобы избежать использования $ scope и использования контроллера в качестве синтаксиса. Однако у меня проблема с получением данных от службы.AngularJS Ctrl как синтаксис с сервисами
Вот мой пример:
var myApp = angular.module('myApp', []);
myApp.controller('MainCtrl', ['$http', '$location', 'userService',
function($http, $location, userService) {
this.name = 'John Doe';
// this.userData = {
// }
this.userData = userService.async().then(function(d) {
return d;
});
console.log(this.userData);
}
]);
myApp.service('userService', function($http) {
var userService = {
async: function() {
// $http returns a promise, which has a then function, which also returns a promise
var promise = $http.get('https://jsonplaceholder.typicode.com/users').then(function(response) {
// The then function here is an opportunity to modify the response
// console.log(response);
// The return value gets picked up by the then in the controller.
return response.data;
});
// Return the promise to the controller
return promise;
}
};
return userService;
});
<body ng-app="myApp">
<div id="ctrl-as-exmpl" ng-controller="MainCtrl as mainctrl">
<h1>Phone Numbers for {{mainctrl.name}}</h1>
<button ng-click="">newest</button>
<p>{{mainctrl.userData}}</p>
<ul>
<li ng-repeat="users in mainctrl.userData">{{users.phone}} -- {{users.email}}</li>
</ul>
</div>
</body>
Эта проблема у меня в том, что данные, возвращаемые из userService.async является объектом, который я не могу показаться, чтобы развернуть через для получения данных, поскольку данные являются дочерними элементами состояния $$, которые, как представляется, не используются в представлении.
Если это не правильный способ использования служб в синтаксисе контроллера As/$ без ограничений, каков правильный способ?
Живой пример здесь: http://plnkr.co/edit/ejHReaAIvVzlSExL5Elw?p=preview
Если я выхожу из «как» и «placeholder» (в моем plnkr: http://plnkr.co/edit/KBnz7yQkyBp3B8MPFpYd?p= Предварительный просмотр Я использую 'vm'), они оба имеют возвращенные данные из вызова userService $ http. Тем не менее, только использование заполнитель работает для получения данных для отображения в представлении. Почему это? – TWLATL
Из-за области JS, когда вы находитесь внутри анонимной функции в 'then', ключевое слово' this' адресует анонимную функцию, поэтому вам нужно установить 'this' экземпляра функции контроллера переменной, поэтому этот экземпляр будет доступен во всех «вспомогательных» функциях внутри контроллера. –