Создание экземпляра фабрики с параметрами angular

#angularjs #angularjs-service

#angularjs #angularjs-сервис

Вопрос:

Таким образом, я использую factory в качестве поставщика ресурсов

 angular.module('resources.users').factory('Users', ['serverResource', function (serverResource) {

    return serverResource('users');
}]);
  

где серверный ресурс предоставляет серверный ресурс для REST API…
но есть api для элементов счета-фактуры в этой форме /invoices/{invoice_id}/item/, поэтому мне нужно передать переменную в конструкторе фабрики.

Я обнаружил, что это можно сделать таким образом:

 angular.module('resources.invoiceItem').factory('InvoiceItem', ['serverResource', function (serverResource) {

    return function (invoiceID) {

        if(!angular.isNumber(invoiceID)) {
            console.log('InvoiceID has to be number!');

            return null;
        }

        return serverResource('invoices/'   invoiceID   '/item');
    }
}]);
  

а затем создать экземпляр следующим образом

 var insertedItem = new InvoiceItem(inserted_id);
  

кажется, все в порядке, даже в отладчике я могу использовать метод для crud, такой как $save, $ saveOrUpdate, $ update или $ remove (предоставляется ресурсом сервера), но когда я позвонил

 insertedItem.$saveOrUpdate(function(){}, function(){}, function(){}, function(){});
  

У меня ошибка undefined — это не функция, и я не понимаю, почему? Я также не понимаю, почему console.log(insertedItem) возвращает меня

 function (data) {
     angular.extend(this, data);
} 
  

Я бы ожидал экземпляр ServerResource…

Итак, мой вопрос в том, что я делаю не так?

Большое спасибо за любой ответ

РЕДАКТИРОВАТЬ: plunker здесь http://plnkr.co/edit/VkZo5kbiNAyudb0yFPhu

Комментарии:

1. Попробуйте воссоздать в скрипке.

2. plunker добавлен к вопросу

3. $saveOrUpdate функции нет

4. был метод $save, хотя, например, точное присвоение имен не требуется, поэтому я переименовал его в $saveOrUpdate

Ответ №1:

Вам нужно вернуть объект, но вы возвращаете функцию конструктора.

Измените return Resource , чтобы вернуться new Resource на serverResource фабрику.

Редактировать:

Продолжая комментарии, попробуйте это:

 return function() {
        return serverResource('invoices');
    }
  

Комментарии:

1. Большое спасибо, это работает, но разве это не испортит простые ресурсы, подобные этому pastebin.com/ZMEVR1Jb ? Похоже, это проблема, см. Этот Плунжер plnkr.co/edit/3ypFMfN5l4JgVuNNkk02

2. @blazek idk, что вы пытаетесь сделать. вы не можете ожидать, что функция-конструктор, которую вы возвращаете из первой фабрики, будет вести себя так же, как объект, который вы возвращаете из второй.

3. У меня есть серверный ресурс для стандартного rest api (например: /invoices/ — GET, POST, PUT, DELETE), но у меня есть элементы для каждого счета, и api похож на (/invoices/{InvoiceID}/), поэтому мне нужно как-то передать идентификатор счета в адрес rest, этоединственное исключение в моем API, все остальные находятся в стандартной форме, но я не знаю, как это сделать с помощью factory … извините за мое возможное плохое объяснение

4. Спасибо, что помогли мне, но я боюсь, что это не решит мою проблему… Мне просто нужно передать параметр (мне нужен этот объект ServerResource ..) на завод или использовать лучший компонент, но как новичок, я не уверен, какой именно…

5. @blazek извините, я не могу понять, чего вы хотите.