使用工厂模式时如何创建一个空的 $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>
};
}
我在工厂模式中使用 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>
};
}