即使`$ stateparams`改变了,控制器也只初始化一次

时间:2015-11-19 18:08:58

标签: angularjs ionic-framework angular-ui-router ionic

我最近开始使用 Ionic Framework (因此也使用了 Angular.js )我遇到了的问题Angular UI路由器:当$stateParams之一更改时,我注册的状态之一不会重新初始化。起初我认为它发生是因为状态是抽象的并且有孩子,所以它永远不会直接激活 - 但即使我把它改为非抽象的,也是最深的"状态(即,当看到树结构内的状态时的叶子),问题仍然存在。奇怪的是,它似乎不会发生在其他州。

我尝试过不同的方法并仔细阅读文档,但我找不到问题的原因。

以下是我用来注册状态的代码。状态app.festival是我遇到问题的那个:

  • 当我第一次链接到app.festival.overview状态时,例如使用URL /festival/33/overview,状态的控制器以及app.festival的抽象父控制器正确初始化
  • 然后,当我回到其他地方,然后链接到/festival/21/overview之类的东西时,只有这个状态的控制器被重新初始化,但不是它的抽象父控制器(尽管参数为festivalId是其中的一部分,我应该触发重新加载)
  • 这导致由festivalId状态管理的实际节日数据(由app.festival引用)在整个应用程序中保持不变,因为基本上它只是初始化一个"实例&#34 ; app.festival的控制器,无论$stateParams
  • 如何

我需要这种结构的原因是需要有一个页面(状态)的整个部分来处理单个节日(应该由app.festival州管理)。

$stateProvider

.state( 'app', {
    url: '',
    abstract: true,
    views: {
        'appContent': {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        }
    }
})

.state( 'app.general', {
    url: '/general',
    abstract: true,
    views: {
        'mainContent': {
            templateUrl: 'views/sections/general.html',
            controller: 'GeneralCtrl'
        }
    }
})

.state( 'app.festival', {
    url: '/festival/{festivalId:int}',
    abstract: true,
    views: {
        'mainContent': {
            templateUrl: 'views/sections/festival.html',
            controller: 'FestivalCtrl'
        }
    }
})

.state( 'app.general.festivals', {
    url: '/festivals',
    views: {
        'generalContent': {
            templateUrl: 'views/pages/general-festivals.html',
            controller: 'GeneralFestivalsCtrl'
        }
    }
})

.state( 'app.general.events', {
    url: '/events',
    views: {
        'generalContent': {
            templateUrl: 'views/pages/general-events.html',
            controller: 'GeneralEventsCtrl'
        }
    }
})

.state( 'app.general.event', {
    url: '/events/{eventId:int}',
    views: {
        'generalContent': {
            templateUrl: 'views/pages/general-event.html',
            controller: 'GeneralEventCtrl'
        }
    }
})

.state( 'app.festival.overview', {
    url: '/overview',
    views: {
        'festivalContent': {
            templateUrl: 'views/pages/festival-overview.html',
            controller: 'FestivalOverviewCtrl'
        }
    }
});

.state( 'app.festival.guide', {
    url: '/guide',
    views: {
        'festivalContent': {
            templateUrl: 'views/pages/festival-guide.html',
            controller: 'FestivalGuideCtrl'
        }
    }
});

如果有人能帮助我,那将是很好的,因为我已经花了相当长的时间来研究这个问题,但还没有找到解决方案。如果您需要更深入地了解代码的特定部分,我也很乐意在此处发布。

1 个答案:

答案 0 :(得分:2)

这是Ionic的默认行为。默认情况下,它会缓存视图和控制器执行以提高性能。您可以使用cache: false禁用它:

$stateProvider.state('myState', {
   cache: false,
   url : '/myUrl',
   templateUrl : 'my-template.html'
});

或者您可以使用ui-sref-opts how to put reload option in ui-sref markup

在网址级别停用它

请参阅Caching文档。