3

我正在使用 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 (所以显示没有更新......)

是否可以获得以前的 Controller 而不是 CollectionCtrl 的新“实例”?为什么要创建一个新的 CollectionCtrl ?什么是最好的方法:所以我很想有一个状态数据来存储当前的 $scope,所以我可以做 $state.currentScope = prg 而不是 $scope.currentProgress = prg。这是一个好方法吗?

谢谢 !

4

1 回答 1

2

最好的方法是定义一个与服务器通信并可能缓存结果的服务。该服务可以注入到控制器中,控制器可以向它询问进度,可能使用$watch,尽管为服务提供回调也可能就足够了,并基于此更新 UI。

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

于 2013-11-10T19:09:18.747 回答