导航到子状态也会刷新其父状态

时间:2016-04-18 10:28:01

标签: javascript angularjs html5 angularjs-directive angular-ui-router

我会尝试提供一个示例伪代码,以便尽可能详细地解释我的问题。我不能在这里放一个有效的代码,因为那里涉及太多的图层,指令和模板。

我的基本结构是:

...
<div>
   <div ui-view>
       <div ui-view></div>
   </div>
</div>
...

当父ui-view内的代码执行$state.go更新子ui-view时,父母也会再次加载。

我们假设父州名为contact,孩子名为details。我的$state.go来电是$state.go("contact.details")$stateProvider配置如下:

$stateProvider.state({ name: "contact" /*,  rest of properties */ });
$stateProvider.state({ name: "contact.details", /*,  rest of properties */ });

此外,整个孩子ui-view发生在指令翻译中。让我们说它会是:

<div>
   <div ui-view>
       <directive>
           <content>
                <div ui-view></div>
           </content>
       </directive>
   </div>
</div>

有了这些细节,您会发现任何问题吗?为什么$state.go("contact.details")也重新加载contact? (请注意,contact.details已加载,但重新加载contact会产生副作用,因为控制器会再次执行...)。

更新

如果我在$state.go("details")的控制器上拨打contact,则会出现同样的问题,但一旦加载,当我$state.go到其他子状态时,每个子状态按预期打开,但再次调用父状态控制器

2 个答案:

答案 0 :(得分:0)

我没有问题,但我与你有所不同,我的父状态要么是抽象的,要么重定向到他控制器中的默认子项。

所以我会

$stateProvider.state({ name: "contact" /*,  rest of properties */ 
      controller:['$state', function($state){
         if($state.current.name=='contact'){
              $state.go('contact.main');
         }
      }]
 });
$stateProvider.state({ name: "contact.main", /*,  rest of properties */ 
$stateProvider.state({ name: "contact.details", /*,  rest of properties */ });

答案 1 :(得分:0)

最后,我想出了如何解决我的问题/场景。

  1. 我已使用点语法作为第一个参数切换到注册子状态。例如Cloud.Messages.create({ to_ids: to.join(','), body: 'New Message', subject: 'Test Message', custom_fields: { "[ACS_File]file_id":videoFile, "[ACS_User]owner_id":to.join(','), "pausedAt" : pausedAt, "correctAnswer": correctAnswer, "a2" : a2, "a3" : a3 } }, function (e) { if (e.success) { var message = e.messages[0]; alert('Success:\n' + 'id: ' + message.id + '\n' + 'subject: ' + message.subject + '\n' + 'body: ' + message.body + '\n' + 'updated_at: ' + message.updated_at); //Her gikk alt bra og melding og video er lastet opp. På tide å sende en push :-) } else { alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e))); } }); } 而不是$stateProvider.state("a.b", {})。我知道我的问题是我使用$stateProvider.state({ name: "b", parent: "a" });注册州。自从我发布此Q&amp; A。

  2. 以来,我已经多次更改了我的代码
  3. 我现在在子状态name: "a.b"中调用$state.go("a.b")来打开默认子状态(这是问题的根源)。请参阅Angular JS ui-router how to redirect to a child state from a parent?