2014-12-23 57 views
2

我在角度应用中使用角度ui路由器。对于路由部分,我已经写了角度ui路由器加载视图两次

var routerApp = angular.module('routerApp', ['ui.router']); 

routerApp.config(function($stateProvider, $urlRouterProvider) { 

$urlRouterProvider.otherwise('/home'); 

$stateProvider 

    // HOME STATES AND NESTED VIEWS ======================================== 
    .state('home', { 
     url: '/home', 
     templateUrl: 'partial-home.html', 
      controller : function($scope,$state){ 
      $scope.$on('$viewContentLoaded', function(){ 
       console.log("home content loaded",$state.current); 
      }) 
      } 
    }) 

    // nested list with custom controller 
    .state('home.list', { 
     url: '/list', 
     template: 'I am using a list.' 
    }) 

    // nested list with just some random string data 
    .state('home.paragraph', { 
     url: '/paragraph', 
     template: 'I could sure use a drink right now.' 
    }) 

}); 

在部分home.html的我wriiten: -

<div class="jumbotron text-center"> 
    <h1>The Homey Page</h1> 
    <p>This page demonstrates <span class="text-danger">nested</span> views.</p> 

    <a ui-sref=".list" class="btn btn-primary">List</a> 
    <a ui-sref=".paragraph" class="btn btn-danger">Paragraph</a> 

</div> 

<div ui-view></div> 

当我执行这个应用程序在浏览器中,如果我打开了现在路线

/home 

浏览器控制台显示“归属的内容加载”一次,然后如果我点击列表链接,地址栏变为

/home/list 

然后控制台也显示一次。

但是,如果当时刷新浏览器选项卡(当路由是home/list时),控制台会显示两次。请帮助我为什么会发生这种事情。

回答

1

因为home.list一种家的孩子的状态,当你重新加载home.list 页它首先初始化视图家居控制器比视图列表控制器,这样$ viewContentLoaded被调用两次

我猜你使用家庭模板内的ui-view会导致孩子和父母共享相同的范围。你正在倾听孩子和家长的事件范围。所以被称为两次是很自然的

+0

由于列表是家庭的孩子,那么它显然会首先加载视图,然后是视图列表。但这里的家庭观点正在被加载两次。我没有添加任何控制台列表viewContentLoaded。另一件事是,当我在/ home并点击列表链接时,同样的事情也会发生。但在那种情况下,它只显示一个控制台。 – Indra

+0

我想你使用ui-view在家庭模板中导致孩子和父母共享相同的范围。你正在倾听孩子和家长的事件范围。所以被调用两次是很自然的 – bahadir

+0

我也为列表定义了一个控制器,所以它没有得到相同的范围。同样的事情正在发生。 – Indra

1

这些是嵌套视图。重新加载后控制台中有两条消息的原因是: 当您在/ home开始时,加载了本地状态。当你去那里的/ home/list时,只有home.list需要加载,因为home状态已经被加载。当你重新加载时,有两个状态需要加载:home和home.list。

编辑:我没有足够的声誉,所以我不能评论。我想你使用ui-view在家庭模板中导致孩子和父母共享相同的范围。你正在倾听孩子和家长的事件范围。所以被称为两次是很自然的

+0

由于列表是家庭的孩子,那么它显然会首先加载视图,然后再加载列表的视图。但这里的家庭观点正在被加载两次。我没有添加任何控制台列表viewContentLoaded。另一件事是,当我在/ home并点击列表链接时,同样的事情也会发生。但在那种情况下,它只显示一个控制台。 – Indra