如何在根范围内访问已解决的日期

时间:2014-07-31 09:55:24

标签: angularjs angular-ui-router

在我的应用程序中,我声明使用resolve子句从服务器获取各种资源。

我还有一个全局控制器,需要访问这些资源。例如,考虑一个需要显示这些资源的一些数据的面包屑。

如何从全局控制器访问这些资源?即使我手头有状态对象,我也无法知道如何提取已解析的属性。

编辑:我使用ui-router包进行路由。

2 个答案:

答案 0 :(得分:0)

据我所知,你有类似的东西:

  .when('/', {
    controller: 'HomeCtrl',
    templateUrl: 'home.html',
    resolve: {data: someDataFetcher}
  })

您需要访问全局控制器中的数据。我必须看到一个代码示例,以完全理解您的需求,但我建议使用共享服务。

function HomeCtrl (data, myDataService) {
  myDataService.data = data;
}

function GlobalCtrl (myDataService) {
  myDataService.data // => The data
}

服务只有一个实例,因此很容易使用它来跨控制器共享状态和资源。

希望这有帮助。

<强>更新

创建解决方案闭包:

var myResolveClosure = function (resolver) {
    // Return a wrapper around the resolver
    return function (globalController, $q) { 
      var deferred = $q.defer();
      resolver($q).then(function (data) {
        globalController.addData(data);
        deferred.resolve(data);
      }).catch(function () {
        deferred.reject();
      });
      return deferred.promise;
    }
}

  .when('/', {
    controller: 'HomeCtrl',
    templateUrl: 'home.html',
    resolve: {
     data: myResolveClosure(function ($q) {
       var deferred = $q.defer();
       // do something and resolve with the data
       return deferred.promise;
     })
    }
  })

所以基本上你传递了获取数据所需的特定解析器。 “myResolveClosure”将在解析器周围包装一个函数,将$ q传递给特定的解析器以进行一些提取。然后它将从特定的解析器中解析数据并将其传递到全局控制器,然后自行解析,以便您指定的任何控制器也将获取数据。

希望这是有道理的: - )

答案 1 :(得分:0)

我们的想法是添加一个取决于所需数据的解析密钥(请参阅下面代码中的breadcrumb)。当调用此密钥的功能时,我们可以确保我们的数据item可以使用。然后我们把它放在状态(data属性)上。

.state('some.item.detail.state', {
  url: '/:itemId',
  resolve: {
    item: function($stateParams, MyServerResource) { 
            return MyServerResource.get({itemId: $stateParams.itemId}).$promise;
          },
    breadcrumb: function(item) {
                  this.data = item;
                }
  },
  templateUrl: 'myTemplate.html'
}

要使用全局控制器中的数据,我们只需检查$state.current.data