我有一个问题,我找不到合适的答案 .
好的,我有从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 回答
我想你需要看一下angular-ui的ui-router指令 .
它专为嵌套路由而设计 .
https://github.com/angular-ui/ui-router
http://angular-ui.github.io/ui-router/sample/#/
您可以在视图中嵌套控制器,因此每个子控制器都会继承父模型 .
看一下'Controller Inheritance Example'的角度文档:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller
控制器:
然后你的视图看起来像这样:
js上面的例子:http://jsfiddle.net/guilhermenagatomo/pAHR8/
更复杂的方法是使用服务在控制器之间共享数据 .
如上所述,您可以在应用程序中嵌套控制器 - 即;
内部控制器可以访问外部控制器范围内定义的任何内容 - 它会遮蔽外部控制器的值 . 您还可以通过内部控制器范围内的$ scope . $ parent访问外部控制器中的值 . 这可能会有所帮助:Inheritance for scopes in AngularJS
理想情况下,您应该使用服务来检索数据并存储它 . 然后,您可以从服务中检索它 . 另一个优点是,如果服务有任何更改,您可以将服务设计为仅刷新数据,从而节省您必须进行可能冗余的调用 . Socket.io可能可以用于此,或者您可以定义一个计时器,以便它只在一段时间后刷新 .
至于错误信息;我可能会在必要的位置创建try / catch(或者您打算用于错误的任何逻辑)块并将错误代码传递给errorMessageService . 在我看来,我会将错误参数绑定到服务上 . 如果服务中存在错误,它将在视图中显示错误 .
1
在我看来,控制器应该只用于启动范围状态,数据加载任务应该移动到
angular.factory
或angular.service
取决于您的需求 . 好处是:服务对象存在于应用程序生命周期中 . 您将始终处理相同的对象,以便即使您路由到另一个URL或控制器也可以保留数据 .
您的数据随处可用
您不必担心使用范围继承 .
在某些情况下,你想在你的HTML中使用
ng-repeat
,你可以这样做:所以你的
ng-repeat
将成为:2
你可以在服务对象中访问$ rootScope,但是如果你按照我的第一个回答,你真的不必担心它 . 您可以在
app.service
中的服务对象中附加错误消息,然后它将作为$rootScope.yourDataService.errorMessage
提供 .