【问题标题】:How to create an empty $resource when using the factory pattern使用工厂模式时如何创建一个空的 $resource
【发布时间】:2019-04-28 20:09:39
【问题描述】:

我在工厂模式中使用 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 支持的对象。 :) 非常感谢。

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

【问题讨论】:

  • 大部分逻辑都需要放入服务中,并且不仅仅是从服务中返回$resource。围绕$resource 编写一个函数,并且还可以通过传入参数来创建多个$resource。换句话说,将服务视为一个完整的 CRUD 工厂

标签: javascript angularjs angularjs-resource


【解决方案1】:

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

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

【讨论】:

  • 有可能这么简单吗?显然是的。 :) 除了在第二行覆盖新对象外,我认为应该是$scope.widget.id = 'myNewId';。可能有一种将匿名对象/值散列传递给“新”调用的好方法,但我还没有弄清楚魔法咒语。
  • 这有效:$scope.widget = new myWidget({ id: 'myNewId' });。 (编辑太晚了!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多