如何在使用工厂模式时创建一个空$资源

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

本文关键字:一个 资源 创建 工厂 模式      更新时间:2023-09-26

我在工厂模式中使用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),但这似乎很蹩脚。没有简单的方法从工厂中创建一个新的$资源吗?即:

    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支持的对象。:)谢谢。

(也许问题应该是"我如何使用angularjs工厂来创建一个对象,就好像我是注入器一样?")

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

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