使用工厂模式时如何创建一个空的 $resource

How to create an empty $resource when using the factory pattern

我在工厂模式中使用 angular $resource,它被注入其中,所以我只需要在一个地方创建一次模板。这行得通。

我似乎找不到任何关于如何创建新资源对象的文档。这会在需要保存时创建条件分支,因为我没有要调用 $save() 的对象。

例如:假设我有这个资源:

myService.factory('myWidget', [ '$resource',
  function($resource){
    return $resource('/my/widget/:id', {
  [...]

因此我的控制器可以轻松访问 myWidget:

function( $scope, ... myWidget ) {

    $scope.widget = myWidget.get({id: 'myId'});
    $scope.save = function() {
        $scope.widget.$save(); // plus progress dialog error handling etc
    };
}

非常干净,很棒,应该如此。但是,如果我想创建一个新的,我需要创建和保存的条件代码。

function( $scope, ... myWidget, mode ) {

    if (mode === 'create') {
        $scope.widget = {
            id: 'myNewId',
            property: <lots and lots of properties>
        };
    }
    else {        
        $scope.widget = myWidget.get({id: 'myId'});
    }

    $scope.save = function() {
        $scope.widget.$save(); // Not a $resource; $save() does not exist
    };
}

显然,我可以将条件代码放在 save() 中,或者我可以将小部件作为参数传递,如 myWidget.save($scope.widget),但这似乎很蹩脚。没有简单的方法从工厂简单地创建一个新的 $resource 吗?即:

    if (mode === 'create') {
        $scope.widget = myWidget.new({
            id: 'myNewId',
            property: <lots and lots of properties>
        });
    }

这在功能上等同于:

    if (mode === 'create') {
        $scope.widget = $resource('/my/widget/:id');

但显然没有在工厂中复制资源代码。

肯定有一些简单的语法可以做到这一点。是吗?

我正在使用 AngularJS 1.3。我真的希望这是一个愚蠢的问题,因为它看起来像是一个明显的用例。甚至 Backbone 也有办法使用默认值创建新的 REST 支持的对象。 :) 非常感谢。

(也许问题应该是"how do I create an object using the angularjs factory, as if I were the injector?")

您需要创建一个新的小部件:

if (mode === 'create') {
    $scope.widget = new myWidget();
    $scope.widget = {
        id: 'myNewId',
        property: <lots and lots of properties>
    };
}