Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在ui路由器中继承解析数据_Angularjs_Angular Ui Router - Fatal编程技术网

Angularjs 如何在ui路由器中继承解析数据

Angularjs 如何在ui路由器中继承解析数据,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我这里有个棘手的情况。我的父状态和子状态都在顶层(index.html)覆盖相同的ui视图。因此,当它从父级进入子级状态时,作用域被破坏(我想?)基本上父级有一个解析,它存储在MetricData属性中,我似乎无法从子级访问它,因为我假设它不是嵌套的。有没有一种方法可以在子对象中获取metricdata属性,而不必在子对象中再次手动调用相同的ajax调用 母国 .state("home.metric", { url: "/category/:categoryId/metri

我这里有个棘手的情况。我的父状态和子状态都在顶层(index.html)覆盖相同的ui视图。因此,当它从父级进入子级状态时,作用域被破坏(我想?)基本上父级有一个解析,它存储在MetricData属性中,我似乎无法从子级访问它,因为我假设它不是嵌套的。有没有一种方法可以在子对象中获取metricdata属性,而不必在子对象中再次手动调用相同的ajax调用

母国

     .state("home.metric", {
      url: "/category/:categoryId/metric/:metricId/name/:metricName",
      views: {

        'main@': {

          templateUrl:
            function (stateParams){
              //move this to a util function later
              var tempName = unescape(stateParams.metricName);
              tempName = tempName.replace(/\s/g, "-");

              return '../partials/slides/' + tempName + '.html';
            },
          resolve: {
            MetricData: ['MetricService', '$stateParams', 
              function(MetricService,    $stateParams){
                var data = { categoryId : $stateParams.categoryId, metricId : $stateParams.metricId};
                return MetricService.getMetricDetails(data);
              }]
          },
          controllerProvider: 
            function ($stateParams) {
              var tempName = unescape($stateParams.metricName);
              tempName = tempName.replace(/\s+/g, '');

              return tempName + 'Ctrl';
            }
        }
      }

    })
儿童国家

.state("home.metric.detail", {
      url: "/detailId/:detailId/detailName/:detailName",
      views: {

        'main@': {
          templateUrl:
            function ($stateParams){
              //move this to a util function later
              var tempName = unescape($stateParams.detailName);
              tempName = tempName.replace(/\s/g, "-");

              return '../partials/slides/' + tempName + '.html';
            },
          resolve: {
            DetailData: ['DetailService', '$stateParams',
              function(DetailService,      $stateParams){
                var data = { categoryId : $stateParams.categoryId, detailId : $stateParams.detailId};
                return DetailService.getDetails(data);
              }],
            // MetricData: ['MetricService', '$stateParams', 
            //   function(MetricService,    $stateParams){
            //     var data = { categoryId : $stateParams.categoryId, metricId : $stateParams.metricId};
            //     return MetricService.getMetricDetails(data);
            //   }]
          },
          controllerProvider: 
            function ($stateParams) {
              var tempName = unescape($stateParams.detailName);
              tempName = tempName.replace(/\s+/g, '');

              return tempName + 'Ctrl';
            }
        }

      }

    })

I.问题的答案:

子项,因为其未嵌套。。。有没有办法在子对象中获取metricdata属性

基于

子州从父州继承以下内容:

  • 通过resolve解决依赖关系
  • 自定义数据属性
不会继承任何其他内容(没有控制器、模板、url等)

结合

请记住,仅当嵌套了状态的视图时,作用域属性才会沿状态链向下继承。
作用域属性的继承与状态的嵌套无关,而与视图(模板)的嵌套有关

完全可能存在嵌套状态,其模板填充站点中不同非嵌套位置的ui视图。在这种情况下,您不能期望在子状态视图中访问父状态视图的范围变量

II.虽然这一点现在应该很清楚,但我们仍然需要找到一种方法来解决:

是否有一种方法可以在子对象中获取metricdata属性,而不必在子对象中再次手动调用相同的ajax

我想说,答案也是有的。例如

。。将共享视图/解析程序移动到最小公分母

例如,我们可以在以下问答中这样做,请参见:

特殊的父级/根级状态:

$stateProvider
  .state('root', {
    abstract : true,
    // see controller def below
    controller : 'RootCtrl',
    // this is template, discussed below - very important
    template: '<div ui-view></div>',
    // resolve used only once, but for available for all child states
    resolve: {
      user: function (authService) {
          return authService.getUserDetails();
      }
    }
  }) 
这被注入到我们的状态/视图层次结构之上,任何子状态都将从中获益

// any previously root state will just use the above as a parent
.state('index', {
    url: '/',
    parent : 'root',

检查更多详细信息并在

中查看,超时后尝试使用$scope.$parentfunction@GeoJacob我该把它放在哪里。在子级的控制器中或在“解析”区域中?@GeoJacob实际上这不起作用,父级是根范围,因为子级覆盖父级的视图。如果它嵌套在父作用域中,那么parent会起作用的。是的,我在某处看到了一个解决方案。看起来我需要创建一个额外的抽象状态来保存我的所有信息。我希望我能在没有额外抽象状态的情况下使用服务/工厂服务工厂。。。注入$rootScope也会起作用。但从我的角度来看,这个解决方案是。。。清洁工我想说。。
// any previously root state will just use the above as a parent
.state('index', {
    url: '/',
    parent : 'root',