UI-Router:我可以永远使用相同的控制器吗?

时间:2013-11-10 18:23:50

标签: angularjs scope angular-ui-router

我正在使用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。 这是一个好方法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这里采用的最佳方法是定义一个service,它将与服务器通信并可能缓存结果。可以在控制器中注入此服务,并且控制器可以使用$watch来询问进度,但是为服务提供回调也可能就足够了,并且基于此更新UI这一点。

控制器应该是短暂的,不应该依赖它们是Angular中的单例对象。重要的是,除了他们支持的模板所需的状态之外,它们不应包含任何状态。当路由变为活动时再次创建,以便我们可以编写相对简单的代码,初始化$scope一次并确保它将包含信息(路由)模板尽可能。如果为/app/:object_id之类的每条路径保留一个控制器并且用户经常切换路由,这也可以避免内存泄漏。