Javascript Angularjs ui路由器:父级解析不会从子级触发

Javascript Angularjs ui路由器:父级解析不会从子级触发,javascript,angularjs,angular-ui-bootstrap,angular-ui-router,Javascript,Angularjs,Angular Ui Bootstrap,Angular Ui Router,在我的angularjs应用程序中,我有角度ui引导选项卡,在选择选项卡时,我使用$state.go和浏览器上的状态转换url更改为不同的状态 我的父静态选项卡指向$state:home.summary,而动态选项卡指向$state:home.summary.detail。 当我从父级转到子级时,会激发子级解析方法,但当我从子级移动到父级时,不会激发父级解析方法 状态更改,url更改,但未触发父解析并保持不变 Routes.js .state('home', { abstr

在我的angularjs应用程序中,我有角度ui引导选项卡,在选择选项卡时,我使用$state.go和浏览器上的状态转换url更改为不同的状态

我的父静态选项卡指向$state:home.summary,而动态选项卡指向$state:home.summary.detail。 当我从父级转到子级时,会激发子级解析方法,但当我从子级移动到父级时,不会激发父级解析方法

状态更改,url更改,但未触发父解析并保持不变

Routes.js

 .state('home', {
          abstract: true,            
          url: '/home',
          templateUrl: 'scripts/home.html'
   })
.state('home.summary', {
url: '/summary', 
controller: 'SummaryCtrl',                
views: {               
       'summary': 
          {
                    templateUrl: "scripts/home/summary.html",
                    resolve: {
                     load: function ($rootScope,$stateParams,ServiceA) {
                        ServiceA.get().$promise;
                     }
                    }
          }
       }
})
.state('home.summary.detail', {
url: '/detail/:id',
controller:'DetailCtrl',                 
views: {               
       'detail': 
          {
                   templateUrl: "scripts/home/detail.html",
                   resolve: {
                     load: function ($rootScope,$stateParams,ServiceB,$timeout) {
                       var promise=ServiceB.retrieve(id);
                       return promise;
                     }
                    }
          }
       }
}) 
Tabs.html

  <div ng-controller="TabsCtrl">
  <ul tabset>
  <li tab select="selectStaticTab()">
   <span tab-heading>Search<a style="left:9px" class="glyphicon glyphicon-search"></a>         </span>       
         <div class="well">  
             <div ui-view="summary"></div>    
         </div> 
   </li>
    <li tab ng-repeat="tab in tabs track by tab.id"  active="tab.active"     select="tab.select()"> 
     <span tab-heading>{{tab.title}}</span>
         <div ui-view="detail"></div>
   </li>
  </ul>   
  </div>

  • 搜寻
  • {{tab.title}}
为什么不从子状态触发父解析??? 任何帮助都将不胜感激

多谢各位


你的草稿有很多问题,我试着把它们都写出来

1) 首先,我们使用的是
ui路由器
,因此不能使用
。我们现在有了状态,每个状态都可以有更多的视图,这些视图都有自己的控制器(即控制器属于一个状态的视图部分)

2) 正如刚才所解释的,
视图
确实有
控制器
(正好一个)。非状态-它们没有控制器。所以我将控制器定义从状态移到视图中

    .state('home.summary', {
      url: '/summary',
      // NOT HERE
      views: {
        'summary': {
          ...
          controller: 'SummaryCtrl',
        }
      }
    })
    .state('home.summary.detail', {
      url: '/detail/:id',
      // NOT HERE
      views: {
        'detail@home': {
          ...
          controller: 'DetailCtrl',
3) 父级和子级的解析应具有不同的名称。我这样更改了子解析(请参见名称
load2
而不是
load
):

4) 即使我们想要这样:
ui视图
也不能在中继器内部。当然可以,但这仅仅意味着状态视图将被放置在那里,重复的次数是相同的(但请参见下面的..如何做到这一点)

我将S
ui视图
移动到中继器外部:

<li tab 
  ng-repeat="tab in tabs track by tab.id" active="tab.active" select="tab.select()">
  <span tab-heading>{{tab.title}}</span>
</li>
<hr />
<div ui-view="detail"></div> // moved outside of repeater
检查完整的工作解决方案

很少有人阅读(我会说):

  • 如何使用
  • 如何披露

谢谢,这是一个很好的解释。我发现父级解析没有从子级触发增益,因为父级状态已经重新加载,我不确定再次重新加载父级是否好,如果是,如何再次重新加载父级???如果重新加载父级,子级状态模板是否会丢失先前解析的数据???是,父级重新加载===将再次运行所有解析程序。另一方面,如果仅对子级进行重新排序,则不会调用父级解析,它已经具有值。。。重要的是命名不同;)祝你好运,ui路由器建议:也许你不这么认为,请检查这个:而且-我们应该将解析内容移到最小公分母的状态。。。我会说;)
<li tab 
  ng-repeat="tab in tabs track by tab.id" active="tab.active" select="tab.select()">
  <span tab-heading>{{tab.title}}</span>
</li>
<hr />
<div ui-view="detail"></div> // moved outside of repeater
    .state('home.summary', {
      url: '/summary',          
      views: {
        'summary': { // ok name, while direct parent is home
         ....
        }
      }
    })
    .state('home.summary.detail', {
      url: '/detail/:id',          
      views: {
        'detail@home': { // we have to add @home to say that the target  
          ....           // is in a home state not in our parent
        }
      }