创建一个通用的 angularjs listController

Posted

技术标签:

【中文标题】创建一个通用的 angularjs listController【英文标题】:Creating a generic angularjs listController 【发布时间】:2015-01-19 15:07:27 【问题描述】:

Angular ui-router 允许我解决可以在我的控制器中使用的不同注入。

我创建了一个简单的通用 ListController,并在 ui-router 中注入了一个对象,该对象包含特定于该特定视图的 CRUD 函数以及模板。

因此,例如,假设我有 2 个具有相同“crud”语法的服务:

addPerson(person, callback)
deletePerson(person, callback)
editPerson(person, callback)
....
addCar(car, callback)
deleteCar(car, callback)
editCar(car, callback)
....

我创建了一个映射对象来将这些服务的 CRUD 函数映射到我的通用控制器中,该控制器是通过 ui.router 注入的。

通用控制器:

controller('ListCtrl', ['$scope', 'itemList', 'functions', function ($scope, itemList,   functions) 
    $scope.itemList = itemList;

    $scope.addItem = function()
        functions.add($scope.item, callback);
    
    .....

路由器:

        .state('app.people', 
            url: '/people',
            templateUrl: 'views/people.html',
            resolve: 
                    functions: ['People', function(People)
                        return 
                        add: People.createPerson,
                        update: People.updatePerson,
                        delete: People.deletePerson,
                        getItemList: People.getPeopleList
                    
                    ],
                itemList: ['$q', 'People', function($q, People)
                var deferred = $q.defer();
                    People.getPeopleList(function(resp, status)
                        deferred.resolve(resp);
                    );
                    return deferred.promise;
                ],
                ,
            controller: 'GenericController'
        )

因此,您也可以将它与汽车一起使用,只需在其状态定义中注入不同的函数映射即可。

像魅力一样工作。

但现在我希望能够在 div 中使用我的控制器,而不仅仅是在全视图中。现在问题来了:

如果我使用 ng-controller 指令,注入器将不知道提供什么作为 'itemList' 或 'functions'(这是映射对象),但如果我通过 $controller 对象实例化它,那么它没有自己的范围,我得到一个

Unknown provider: $scopeProvider <- $scope

因为它无法创建自己的子作用域.. 我想我可以通过 $rootScope.$new() 或类似的东西创建一个新范围,但感觉太像黑客了,而且由于我是 Angular 新手,我认为这对于类似的东西来说可能是一个不好的方法这个..

有什么建议吗?

【问题讨论】:

【参考方案1】:

为了将来参考,我最终编写了一个由通用控制器和微型专用控制器组成的系统that extend them。

对于上面的示例,通用控制器是“PeopleController”和“CarController”的子类。在控制器代码的开头,他们每个人都会做这样的事情:

controller('PeopleController', ['$scope', 'peopleService', function ($scope, peopleService) 
angular.extend(this, $controller('listController', $scope: $scope, functions:

        add: peopleService.addPerson,
        remove: peopleService.removePerson,
        [...]

    ));

    $scope.people = $scope.itemList;


所以现在我甚至可以在 ng-controller 指令中自行实例化控制器,并且它们将为所有 CRUD 方法使用通用控制器。

【讨论】:

以上是关于创建一个通用的 angularjs listController的主要内容,如果未能解决你的问题,请参考以下文章

单击angularjs后禁用按钮

带有 AngularJS 的门户类型应用程序(多个独立应用程序)

spring-boot 弹簧安全 angularjs

AngularJS - 如何在所有请求上发送通用 URL 参数?

ExpressJS - 为通用 Nuxt 应用程序和 AngularJS SPA 提供服务

AngularJS:何时使用服务而不是工厂