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

Angularjs 如何在根范围内访问已解析的日期,angularjs,angular-ui-router,Angularjs,Angular Ui Router,在我的应用程序中,我的状态使用resolve子句从服务器获取各种资源 我还有一个需要访问这些资源的全局控制器。例如,考虑一个需要显示这些资源的一些数据的面包屑。 如何从全局控制器访问这些资源?即使我手头有state对象,我也不知道如何提取解析的属性 编辑:我正在使用程序包进行路由。据我所知,您有如下内容: .when('/', { controller: 'HomeCtrl', templateUrl: 'home.html', resolve: {data: som

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

我还有一个需要访问这些资源的全局控制器。例如,考虑一个需要显示这些资源的一些数据的面包屑。 如何从全局控制器访问这些资源?即使我手头有state对象,我也不知道如何提取解析的属性


编辑:我正在使用程序包进行路由。

据我所知,您有如下内容:

  .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传递给特定的解析器以进行一些获取。然后,它将获取从特定解析器解析的数据,并将其传递到全局控制器,然后自行解析,以便您指定的任何控制器也将获得数据


希望这是有意义的:-

这个想法是添加一个取决于所需数据的解析键,请参见下面代码中的breadcrumb。当调用此键的功能时,我们可以确保数据项已准备好使用。然后我们把它放在状态数据属性上

.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。

我的第一个想法是使用服务进行适当的双向数据绑定,但为了告诉您更多信息,我必须在其中查看您的代码和逻辑是的,您正确地描述了问题,谢谢。一个例外,我使用的是ui路由而不是ng路由,但概念是一样的。对于您的解决方案,我现在依赖于一个非常特定的控制器HomeCtrl。如果我有20个州,每个州有3个视图呢?每个控制器都必须用数据通知全局服务。这需要大量的代码重复。您可以使用闭包将函数包装到特定的解析器上。外部函数将等待特定解析程序解析,然后将数据添加到全局控制器,然后使用相同的数据解析自身。请参阅更新:-这可能有效,但相当复杂。对于ng路线,这可能是唯一的方法,我不知道。但由于我使用了ui路由,我找到了一种在一行代码中实现这一点的方法。在您的示例中,这就像添加额外的密钥来解析依赖于数据的内容,然后将route data属性或任何其他私有属性设置为解析值。