我正在使用UI-Router来获得一些"菜单"在我的申请中。
$stateProvider.state("list"
url: "/Focales"
templateUrl: "/demo/focals.html"
controller: FocalCtrl)
$stateProvider.state("collection"
url: "/Collections"
templateUrl: "/demo/collections.html"
controller: CollectionCtrl)
在我的CollectionCtrl中,我触发在服务器上完成的处理,只是等待显示这样的信息(CoffeeScript)
Progress = $resource('/collections/getProgress')
$scope.getProgress = () ->
prg = Progress.get {}, ->
$scope.currentProgress = prg
$scope.getProgress() if prg.end isnt true
我的问题:当用户移动到Focal并返回CollectionCtrl时,我有一个新的CollectionCtrl实例。所以据我所知,$ scope.getProgress代码仍然接收数据但是对于PREVIOUS CollectionCtrl(所以显示没有更新......)
是否可以获得以前的控制器而不是新的"实例" CollectionCtrl的?为什么要创建一个新的CollectionCtrl? 什么是最好的方法:所以我很想有一个状态数据来存储当前的$ scope,所以我可以做$ state.currentScope = prg而不是$ scope.currentProgress = prg。 这是一个好方法吗?
谢谢!
答案 0 :(得分:2)
这里采用的最佳方法是定义一个service,它将与服务器通信并可能缓存结果。可以在控制器中注入此服务,并且控制器可以使用$watch
来询问进度,但是为服务提供回调也可能就足够了,并且基于此更新UI这一点。
控制器应该是短暂的,不应该依赖它们是Angular中的单例对象。重要的是,除了他们支持的模板所需的状态之外,它们不应包含任何状态。当路由变为活动时再次创建,以便我们可以编写相对简单的代码,初始化$scope
一次并确保它将包含新信息(路由)模板尽可能。如果为/app/:object_id
之类的每条路径保留一个控制器并且用户经常切换路由,这也可以避免内存泄漏。