【发布时间】: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