Как создать пустой $ ресурс при использовании фабричного шаблона

Я использую 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), но это выглядит неубедительно. Нет ли простого способа создать новый $ ресурс с фабрики? IE:

    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, как если бы я был инжектором?")

1 ответ

Решение

Вам нужно создать новый виджет:

if (mode === 'create') {
    $scope.widget = new myWidget();
    $scope.widget = {
        id: 'myNewId',
        property: <lots and lots of properties>
    };
}
Другие вопросы по тегам