Я получаю $save(), а не функцию в Angular

#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’?