#angularjs-resource
#angularjs-ресурс
Вопрос:
Я пытаюсь создать относительно простое веб-приложение, следуя руководствам из книги ProAngular . Примеры из книги работают нормально, но когда я пытаюсь создать свое собственное приложение, я застреваю на странной ошибке. Вот часть моего кода:
$scope.dispositionsResource = $resource(dispositionUrl ":id", { id: "@id" },
{ create: {method: "POST"}, save: {method: "PUT"}, delete: {method: "DELETE"}
});
. . .
$scope.updateDisposition = function (disposition) {
alert("DISPOSITION: " disposition.name);
disposition.$save();
}
Функции создания и удаления работают нормально. Метод updateDisposition вызывается из формы HTML, и передается правильное значение расположения (на основе предупреждения). Но ошибка, которую я получаю, это:
"Error: disposition.$save is not a function"
Ни один из моих примеров кода отдельно не определяет функцию сохранения, функция должна быть частью restful service ($resource ). Не так ли?
Любые указатели в правильном направлении были бы весьма признательны.
Ted
Ответ №1:
В итоге я получил эту работу. Не совсем уверен, почему, но я переименовал функцию сохранения в «Обновить» и связал ее с функциональностью PUT.
$scope.dispositionsResource = $resource(dispositionUrl ":id", { id: "@id" },
{ 'create': {method: "POST"}, 'update': {method: "PUT"}
});
$scope.updateDisposition = function (disposition) {
$scope.dispositionsResource.update(disposition);
$scope.editedDisposition = null;
}
сработал вызов update, а не save . Что-то, казалось, мешало использованию термина «сохранить». Как я уже сказал, не уверен, что … пока. Один из тех, кто ломает голову для меня. Спасибо тем, кто пытался помочь!
Ответ №2:
Я сам изучаю angular, но первая проблема, которую я вижу в вашем коде, заключается в том, что не похоже, что вы правильно определяете $resource (справедливое предупреждение, в Angular есть масса предостережений, и вы можете просто углубляться в то, о чем я не знаю).
Я считаю, что более простой способ сделать то, что вы пытаетесь сделать, — это сначала создать angular factory для $resource, например:
angular.module('yourModuleName')
.factory('disposition', function($resource) {
return $resource('/whatever/url/youwant/:id', {
id: '@id'
})
});
А затем оттуда объявите фабрику как зависимость для вашего контроллера:
angular.module('yourModuleName')
.controller('yourControllerName', function($scope, disposition) {
$scope.submitForm = function($scope)
disposition.save($scope.nameOfYourModel);
});
Следует иметь в виду, что в $resource есть все методы, которые вы объявили по умолчанию. Из документов по адресу https://docs.angularjs.org/api/ngResource/service /$resource это то, что доступно из коробки:
{ 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };
Лично я предпочитаю использовать $http
сервис самостоятельно. Да, это немного более подробно, чем использование $resource
, но я чувствую, что это намного легче понять $http
, начиная с angular, чем с $resource
сервиса. Чтобы избавить себя от множества головных болей в будущем, я настоятельно рекомендую ознакомиться с концепцией обещаний в Angular, поскольку многие из его сервисов используют их.
Удачи.
Комментарии:
1. Я ценю попытку, объявляя ее как фабрику, я получаю ту же проблему, $save не является функцией. Я думаю, что это более простая проблема, чем просто определение ее как фабрики или службы, но будь я проклят, если смогу это понять. Я могу использовать службу $ http, но я делал это в качестве учебного упражнения, а также для того, чтобы сделать код немного более модульным. Пока все, что я получаю, это удары головой о стену 🙂 Если я это сделаю, я отправлю ответ с «ответом». Еще раз спасибо за усилия.
2. Мне любопытно, почему вы используете ‘$save’ вместо ‘save’?