gpt4 book ai didi

AngularJS,用于 CRUD UI 的 DRY Controller

转载 作者:行者123 更新时间:2023-12-02 10:22:11 25 4
gpt4 key购买 nike

我有很多数据类型:用户、产品、类别。我有一个用于 CRUD 每种类型数据的 View / Controller 。因此,我的 View 允许创建一个项目,它显示一个列表,并且对于每个项目,您可以编辑和更新,或删除它。
Controller 管理所有 UI 交互。例如,当删除某个项目时,用户可以使用取消按钮几秒钟。在 Controller 中,所有 CRUD 操作都是通过服务完成的。

angular.module('myApp').controller(
'UsersManagerController',
function UsersManagerController($scope, $timeout, userService) {

$scope.deleteUser = function(user) {
user.deleting = true;
user.deletionCancelable = true;
user.deletePromise = $timeout( function() {
user.deletionCancelable = false;
userService.deleteUser(user.id);
}, 2000);
};

$scope.isUserDeleting = function(user) {
return user.deleting;
}

$scope.cancelDelete = function(user) {
$timeout.cancel(user.deletePromise);
user.deletePromise = null;
user.deleting = false;
user.deletionCancelable = false;
}

现在,我想避免为每种类型的数据(产品、类别...)重复此 Controller 代码,而只编写几个 View 。这意味着我想要一个可以动态接收公开特定数据类型的 CRUD 方法的服务的 Controller 。我已经成功地使用 $injector 做到了这一点。 但我不知道如何从 View 中为 Controller 提供服务名称。我已经尝试过:

<div ng-controller="ItemsManagerController" ng-init="setItemService('userService')">

并进入 Controller :

    var _crudService;
$scope.setCrudService = function(serviceName) {
_crudService = $injector.get(serviceName);
}

但是 setCrudService() 是在运行时调用的,由 AngularJs 绑定(bind)管理。这意味着我无法确切知道它何时会被调用,并且之前调用了我的 Controller 的其他一些方法,试图使用尚未设置的服务。

有人知道怎么做吗?
也许我的设计有缺陷?

<小时/>

更新:
我找到了一个解决方案:范围继承。

<div ng-controller="UsersManagerController">
<div ng-controller="ItemsManagerController">
<div ng-repeat="user in items">
<span ng-click="deleteItem(user.id)">Remove {{user.name}}</span>
</div>
</div>
</div>

1) UsersManagerController 将首先被初始化。
2) ItemsManagerController 范围将继承UsersManagerController 范围。

angular.module('myApp').controller('UsersManagerController', 
['$scope', 'userService', function UsersManagerController($scope, userService) {
$scope.crudService = userService;
}]);

angular.module('myApp').controller('ItemsManagerController',
['$scope', function ItemsManagerController($scope) {

$scope.deleteItem = function(itemId) {
$scope.crudService.delete(itemId);
}

$scope.items = crudService.getItems();
}]);

它可以工作,但我必须为每种数据类型编写一个 Controller 。我仍在寻找更优雅的解决方案。

最佳答案

我可以这样想

设置CRUD生成服务

app.service('CRUDService', function($timeout) {
return {

setCRUD: function(scope, service, objName) {

var funcName = "delete" + objName;
scope[funcName] = function(obj) {
obj.deleting = true;
obj.deletionCancelable = true;
obj.deletePromise = $timeout( function() {
obj.deletionCancelable = false;
service.deleteUser(user.id);
}, 2000);
};

funcName = "is" + objName + "Deleting";
scope[funcName] = function(obj) {
return obj.deleting;
}

scope.cancelDelete = function(obj) {
$timeout.cancel(obj.deletePromise);
obj.deletePromise = null;
obj.deleting = false;
obj.deletionCancelable = false;
}

}

}

然后,在 Controller 中使用它

   CRUDService.setCRUD($scope, userService, "User");

关于AngularJS,用于 CRUD UI 的 DRY Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com