Создание нового ресурса 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