Joh*_*son 16 javascript angularjs ngresource
可以在创建时定义一个$resource始终具有相同默认值的Angular new()吗?
例如,如果我有以下资源定义:
var Drawer = $resource('/drawer/:drawerId', { drawerId: '@id'});
Run Code Online (Sandbox Code Playgroud)
Drawer对象需要有一个"socks"属性,我希望它始终被初始化为一个空数组[],也许还有一些其他像'timesOpened'到0,或类似的东西.
这样做的唯一方法是:
var newDrawer = new Drawer({ socks: [], timesOpened: 0});
Run Code Online (Sandbox Code Playgroud)
我正在考虑在我的资源(我称之为drawerService)中使用相同的服务定义一个默认/初始化对象,如下所示:
defaultDrawer = { socks: [], timesOpened: 0};
Run Code Online (Sandbox Code Playgroud)
然后在创建资源时:
//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'});
Run Code Online (Sandbox Code Playgroud)
这是唯一的方法吗?
kan*_*lm3 14
你是对的,没有简单的方法可以做到这一点; 它不是Angular支持的功能.更简洁的方法是在drawerService中创建一个Drawer工厂.它可能看起来像这样:
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
};
});
Run Code Online (Sandbox Code Playgroud)
这将允许您创建一个新的抽屉,如下所示:
//New drawer with defaults
var newDrawer = drawerService.create();
//New drawer with defaults and some other initialization
var anotherDrawer = drawerService.create({material: 'plastic'});
Run Code Online (Sandbox Code Playgroud)
它仍然不是理想的,但它更清洁,也是我能想到完成你想要完成的事情的最不邪恶的方式.