Создание нового ресурса Angular $со значениями по умолчанию?

Можно определить Angular $resource, который всегда имеет одинаковые значения по умолчанию при создании с помощью new()?

Например, если у меня есть следующее определение ресурса:

var Drawer = $resource('/drawer/:drawerId', { drawerId: '@id'});

И объект Drawer должен иметь свойство "socks", которое я хочу всегда инициализировать как пустой массив [], и, возможно, некоторым другим нравится "timesOpened" to 0 или тому подобное.

Единственный способ сделать это будет следующим:

var newDrawer = new Drawer({ socks: [], timesOpened: 0});

Я думал об определении в той же службе, что у меня для моего ресурса (пусть называют ее drawerService) объектом по умолчанию/инициализации следующим образом:

defaultDrawer = { socks: [], timesOpened: 0};

И затем при создании ресурса:

//New drawer with defaults
var newDrawer = new drawerService.Drawer(drawerService.defaultDrawer);
//New drawer with defaults and some other initialization
var anotherDrawer = new drawerService.Drawer(angular.extend(drawerService.defaultDrawer, {material: 'plastic'});

Это единственный способ сделать это?

Ответы

Ответ 1

Вы правы, нет простого способа сделать это; это не поддерживаемая функциональность в Angular. Более простой способ сделать это - создать ящик factory в вашем drawerService. Это может выглядеть примерно так:

angular.module('app').factory('drawerService', function() {

    var Drawer = $resource('/drawer/:drawerId', { drawerId: '@id'});

    function drawerFactory(options) {
        var defaults = {
            socks: [],
            timesOpened: 0
        };
        options = angular.extend(defaults, options || {});
        return new Drawer(options);
    }

    return {
        Drawer: Drawer,
        create: drawerFactory
    };
});

Это позволит вам создать новый ящик следующим образом:

//New drawer with defaults
var newDrawer = drawerService.create();
//New drawer with defaults and some other initialization
var anotherDrawer = drawerService.create({material: 'plastic'});

Он по-прежнему не идеален, но он немного чище и наименее злой способ, я могу думать о том, чтобы выполнить то, что вы пытаетесь выполнить.

Ответ 2

В последнее время я столкнулся с этой проблемой, и это было первое сообщение, появившееся в Google... Ответ предоставлен, но он довольно грязный и меняет способ взаимодействия с объектом $resource. Существует гораздо более простой способ:)

angular.module('app').factory('drawerService', function() {
  var drawer = $resource('/drawer/:drawerId', { drawerId: '@id'});

  drawer.prototype.socks = [];
  drawer.prototype.timesOpened = 0;

  return drawer;
}

И тогда вы просто создадите новый объект со значениями по умолчанию следующим образом:

var drawer = new drawerService();

И вы также можете передать свои собственные параметры здесь...

var drawer = new drawerService({ material: 'plastic' });

Надеюсь, это может помочь кому-то в будущем: D