2015-05-26 3 views
16

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

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

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

И объект Выдвижной ящик должен иметь свойство «носки», что я хочу быть всегда инициализируется как пустой массив [], и, возможно, некоторые другие например, «timesOpened» - 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'}); 

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

ответ

14

Вы правы, нет простого способа сделать это; это не поддерживаемая функция в Angular. Более чистый способ, которым вы можете это сделать, - создать фабрику ящиков в вашем 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 
    }; 
}); 

Это позволит вам создать новый Drawer, как так:

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

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

+0

Эй @ kanzelm3, жаль не приходить сюда раньше. Таким образом, ваш ответ - это улучшенная и более чистая версия того, что я опубликовал :) Мне это нравится, но я собираюсь оставить это немного больше времени, на всякий случай, если появится другая идея. Если нет, я помету ваш ответ как исправьте! Большое спасибо! –

0

Недавно я столкнулся с этой проблемой, и это было первое сообщение, которое появилось в 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(); 

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

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

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

+0

Это не работает должным образом. Элементы прототипа будут «статическими», то есть общими для всех экземпляров. Может использоваться только для функций. –

 Смежные вопросы

  • Нет связанных вопросов^_^