首页 文章

Angularjs控制器

提问于
浏览
3

我有一个问题,我找不到合适的答案 .

好的,我有从api收集的数据,例如

管理员

用户

用户资料

用户统计信息

For this I have

adminCtrl

userCtrl

userprofileCtrl

userstatsCtrl

问题是当我在我的控制器中,如果我想查看userprofile然后userprofileCtrl从url获取路由,如admins /:admin_id / users /:user_id / profile,我必须收集所有数据,如admin,user和profile in每个控制器都能够在我的视图中打印有关用户的所有细节 .

我可以以某种方式嵌套控制器吗?它导致控制器中的大量干燥 .

还想知道打印错误消息的最佳实践是什么,我有apiservice所有请求到我的api,我应该在服务中设置消息如何,rootScope?

4 回答

  • 0

    我想你需要看一下angular-ui的ui-router指令 .

    它专为嵌套路由而设计 .

    https://github.com/angular-ui/ui-router

    http://angular-ui.github.io/ui-router/sample/#/

  • 0

    您可以在视图中嵌套控制器,因此每个子控制器都会继承父模型 .

    看一下'Controller Inheritance Example'的角度文档:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller

    控制器:

    angular.module('App', [])
    .controller('MainCtrl', ['$scope', function($scope){
        $scope.foo = 'foo';
    }])
    .controller('CtrlOne', ['$scope', function($scope){
    
    }])
    .controller('CtrlTwo', ['$scope', function($scope){
        $scope.foo = 'bar';
    }]);
    

    然后你的视图看起来像这样:

    <div ng-app='App'>
        <div ng-controller='MainCtrl'>
            <div ng-controller='CtrlOne'>
                CtrlOne: {{foo}}
            </div>
            <div ng-controller='CtrlTwo'>
                CtrlTwo: {{foo}}
            </div>
        </div>
    </div>
    

    js上面的例子:http://jsfiddle.net/guilhermenagatomo/pAHR8/

    更复杂的方法是使用服务在控制器之间共享数据 .

  • 0

    如上所述,您可以在应用程序中嵌套控制器 - 即;

    <div ng-controller='outercontroller'>
         <div ng-controller='innercontroller'>
         </div>
    </div>
    

    内部控制器可以访问外部控制器范围内定义的任何内容 - 它会遮蔽外部控制器的值 . 您还可以通过内部控制器范围内的$ scope . $ parent访问外部控制器中的值 . 这可能会有所帮助:Inheritance for scopes in AngularJS

    理想情况下,您应该使用服务来检索数据并存储它 . 然后,您可以从服务中检索它 . 另一个优点是,如果服务有任何更改,您可以将服务设计为仅刷新数据,从而节省您必须进行可能冗余的调用 . Socket.io可能可以用于此,或者您可以定义一个计时器,以便它只在一段时间后刷新 .

    至于错误信息;我可能会在必要的位置创建try / catch(或者您打算用于错误的任何逻辑)块并将错误代码传递给errorMessageService . 在我看来,我会将错误参数绑定到服务上 . 如果服务中存在错误,它将在视图中显示错误 .

  • 0

    1

    在我看来,控制器应该只用于启动范围状态,数据加载任务应该移动到 angular.factoryangular.service 取决于您的需求 . 好处是:

    • 服务对象存在于应用程序生命周期中 . 您将始终处理相同的对象,以便即使您路由到另一个URL或控制器也可以保留数据 .

    • 您的数据随处可用

    • 您不必担心使用范围继承 .

    在某些情况下,你想在你的HTML中使用 ng-repeat ,你可以这样做:

    app.run(function($rootScope) {
        $rootScope.yourDataService = yourDataService
    }
    

    所以你的 ng-repeat 将成为:

    <li ng-repeat="item in yourDataService.items"></li>
    

    2

    你可以在服务对象中访问$ rootScope,但是如果你按照我的第一个回答,你真的不必担心它 . 您可以在 app.service 中的服务对象中附加错误消息,然后它将作为 $rootScope.yourDataService.errorMessage 提供 .

相关问题