使用默认值创建新的Angular $资源?

时间:2015-05-26 15:21:55

标签: javascript angularjs ngresource

可以定义一个Angular $resource,它在使用new()创建时始终具有相同的默认值吗?

例如,如果我有以下资源定义:

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

Drawer对象需要有一个“socks”属性,我希望它始终被初始化为一个空数组[],也许还有一些其他像'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'});

这是唯一的方法吗?

2 个答案:

答案 0 :(得分: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
    };
});

这将允许您像这样创建一个新的抽屉:

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

它仍然不理想,但它更清晰,也是我能想到完成你想要完成的事情的最不邪恶的方法。

答案 1 :(得分: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();

你也可以在这里传递你自己的参数......

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

希望这可以帮助将来的某个人:D