В контроллере мне нужно получить статус сегмента. Сегменты загружаются из API с использованием $resource
.
В ресурсе у segmentsresource.js
есть:
angular.module('appApp')
.factory('SegmentsResource', function ($resource) {
return $resource('http://localhost:3000/api/v1/segments/:id');
});
В сервисе, segmentsservice.js
меня есть:
angular.module('appApp')
.service('SegmentsService', function (SegmentsResource) {
this.getSegmentStatus = function(segmentId) {
return SegmentsResource.get({
id: segmentId
}, function(segment) {
return segment.status;
})
};
});
Я пытаюсь выполнить return segment.status
поэтому я могу использовать результат ("доступный", "переведенный" и т.д.) В контроллер, main.js
:
$scope.checkAndEditSegment = function(segmentId) {
SegmentsService.getSegmentStatus(segmentId)
.then(function(status) {
if (status === 'available') {
console.log('segment is available');
}
});
};
Однако это не работает. Консольные плюсы: TypeError: Cannot read property 'then' of undefined'
, поэтому у меня есть проблема с обещаниями.
Как это исправить?
Но почему вы берете этот длинный маршрут, когда можете просто вызвать фабрику с контроллера.
angular.module('appApp')
.factory('SegmentsResource', function ($resource) {
return $resource('http://localhost:3000/api/v1/segments/:id');
});
$scope.checkAndEditSegment = function(segmentId) {
SegmentsResource.get(segmentId)
.then(function(status) {
if (status === 'available') {
console.log('segment is available');
}
});
};
getSegmentStatus
в разных контроллерах, поэтому он внутри службы.
Я решил использовать $q
:
В сервисе:
this.getSegmentStatus = function(segmentId) {
var dfd = $q.defer();
SegmentsResource.get({ id: segmentId }, function(segment) {
dfd.resolve(segment.status);
})
return dfd.promise;
};
В контроллере:
SegmentsService.getSegmentStatus(segmentId)
.then(function(status) {
console.log(status);
});
console.log(SegmentsService.getSegmentStatus(segmentId))
в методе$scope.checkAndEditSegment
? Обратите внимание, что обещание доступно через$promise
, см. Docs.angularjs.org/api/ngResource/service/$resourceSegmentsService
возвращайтеSegmentsResource.get(....).$promise
, или вSegmentsService.getSegmentStatus(segmentId)
используйтеSegmentsService.getSegmentStatus(segmentId).$promise
, потому что теперь вы просто возвращаете объект.