добавить пользовательскую функцию в angular $resource

У меня есть угловой ресурс, который выглядит примерно так

app.factory('User', function ($resource) {
    return $resource(
        '/api/user/:listCtrl:id/:docCtrl/', {
            id: '@id',
            listCtrl: '@listCtrl',
            docCtrl: '@docCtrl'
        }, {
            update: {
                method: 'PUT'
            },
            current: {
                method: 'GET',
                params: {
                    listCtrl: 'current'
                }
            },
            nearby: {
                method: 'GET',
                params: {
                    docCtrl: 'nearby'
                },
                isArray: true
            }
        }
    );
});

теперь я хочу иметь полное имя в представлении, могу ли я добавить метод, чтобы, когда я это делаю

$scope.user = User().current();

вместо того, чтобы делать следующее в html

<p>{{ user.first_name }} {{ user.last_name }}</p>

я делаю это

<p>{{ user.get_full_name }}</p>

есть ли способ добавить это свойство в $resource?


person Yousuf Jawwad    schedule 08.08.2013    source источник
comment
:) .. это было около двух лет назад .. :)   -  person Yousuf Jawwad    schedule 01.08.2015


Ответы (3)


Вы можете добавить его как свойство с помощью transformResponse, но могу ли я предложить просто добавить метод к каждому объекту, который возвращает объединенное имя и фамилию:

app.factory('User', function ($resource) {
    var User = $resource(
        '/api/user/:listCtrl:id/:docCtrl/', {
            id: '@id',
            listCtrl: '@listCtrl',
            docCtrl: '@docCtrl'
        }, {
            update: {
                method: 'PUT'
            },
            current: {
                method: 'GET',
                params: {
                    listCtrl: 'current'
                }
            },
            nearby: {
                method: 'GET',
                params: {
                    docCtrl: 'nearby'
                },
                isArray: true
            }
        }
    );
    // add any methods here using prototype
    User.prototype.get_full_name = function() {
        return this.first_name + ' ' + this.last_name;
    };
    return User;
});

Затем используйте:

<p>{{ user.get_full_name() }}</p>

Любые функции, добавленные с использованием прототипа, будут добавлены к каждому объекту, возвращаемому вашей службой. Это отличный способ добавить вспомогательные методы, если вам нужно выполнить сложное получение или настройку свойств службы.

person Jeremy Zerr    schedule 31.12.2013
comment
Работает отлично. Просто убедитесь, что вы квалифицируете свойства с помощью this., споткнулись об это... - person Tim Büthe; 28.11.2014
comment
Спасибо за ответ на фактический вопрос вместо того, чтобы предоставить «лучшие» альтернативы для конкретного сценария исходного вопроса. - person RonLugge; 03.12.2015
comment
@RonLugge да, капитан. как сказал Тим, просто убедитесь, что вы позаботитесь об этом. - person Yousuf Jawwad; 30.12.2016
comment
Обратите внимание, что если ваш метод является массивом один (isArray: true), результирующий объект НЕ БУДЕТ содержать ваш метод, поскольку прототип массива AFAIK доступен только для чтения. - person marco6; 01.02.2017
comment
Почему я должен добавлять метод в прототип, а не объект напрямую? - person gskema; 28.04.2017

поиграв некоторое время с angular, я думаю, что фильтр клиента был бы гораздо более мудрым подходом, чем добавление свойства в $resource.

вот как сделать фильтр

app.filter('getFullName', function () {
    return function (input) {
      if (input) {
        return input.first_name + ' ' + input.last_name;
      } else {
        return 'default';
      }
    };
  });
person Yousuf Jawwad    schedule 31.03.2014

Я думаю, вам стоит посмотреть на transformResponse путь.

Кстати, какую версию angularjs вы используете?

person falinsky    schedule 09.08.2013
comment
я использую angular 1.1.5 ... никогда раньше не смотрел на transformResponse, позвольте мне проверить это, спасибо за указатель - person Yousuf Jawwad; 09.08.2013
comment
вы можете посмотреть на stackoverflow.com /вопросы/17134401/ - person falinsky; 09.08.2013
comment
о .. спасибо .. это решает мою проблему, я думаю :D - person Yousuf Jawwad; 09.08.2013