我的Ionic应用程序允许您从侧面菜单中选择一个项目,然后在主要内容区域中显示两个选项卡(任务,消息).任务和消息选项卡是项目的嵌套状态.
当您在侧面菜单中更改项目时,TaskListCtrl将执行两次.在项目之间切换时,请参阅live demo并观察控制台.我还有一个video,详细说明了这个问题.
如何停止TaskListCtrl执行两次?有没有更好的方法来构建这些嵌套状态?
码
这是我的$stateProvider配置:
.state('project',{ url: "/projects/:projectID",abstract: true,cache: false,controller: 'ProjectDetailCtrl',templateUrl: "templates/project.tabs.html",resolve: { project: function($stateParams,Projects) { return Projects.get($stateParams.projectID); } } }) .state('project.tasks',{ url: '/tasks',views: { 'tasks-tab': { templateUrl: 'templates/task.list.html',controller: 'TaskListCtrl' } } })
来自controllers.js的相关代码片段:
.controller('ProjectDetailCtrl',function($scope,project) { $scope.project = project; console.log('=> ProjectDetailCtrl (' + $scope.project.name + ')') }) .controller('TaskListCtrl',$stateParams) { $scope.tasks = $scope.project.tasks; console.log('\t=> TaskListCtrl') console.log('\t\t=> $stateParams: ',$stateParams) console.log('\t\t=> $scope.tasks[0].title: ',$scope.tasks[0].title) })
资源
> Live demo(在项目之间切换时观察控制台日志)
> Video showing the issue
> Code on GitHub
笔记
>我知道StackOverflow上有类似的问题 – 但是,他们提供的解决方案都没有解决我的问题.*
>我已经读过,当在$stateProvider和ng-controller中连接控制器时会发生这种情况 – 但是,我已经检查过,我不是这样做的.我只用$stateProvider附加控制器.
解决方法
这似乎是路由和参数以及离子选项卡的问题.
我花了差不多一整天都想弄清楚发生了什么.
我认为问题在于您使用带参数的抽象控制器,但这不是问题.
我已经检查了范围,尝试使用controllerAs消除摩擦,并避免引用$scope对象来存储viewmodel但是……没有.
我已经创建了应用程序here的简化版本.
那里没有多少,导航是通过标题中的常量.
你可以看到问题仍然存在.
进行一些调试似乎问题就在于here.
该行调用控制器两次.你可以自己检查一下在ionic.bundle.js的48435行添加一个断点.
您唯一的选择是更改project.tabs.html并加载没有子视图的任务列表.像这样的东西:
<ion-view view-title="{{ project.name }}: Tasks"> <ion-tabs class="tabs-icon-top tabs-positive"> <ion-tab title="{{ project.name }} Tasks" icon="ion-home"> <ion-nav-view> <ion-content> <ion-list> <ion-item class="item-icon-right" ng-repeat='task in project.tasks'> {{ task.title }} <i class="icon ion-chevron-right icon-accessory"></i> </ion-item> </ion-list> </ion-content> </ion-nav-view> </ion-tab> <ion-tab title="About" icon="ion-ios-football" ui-sref="tabs.tab2"> <ion-nav-view name="tabs-tab2"></ion-nav-view> </ion-tab> <ion-tab title="Another" icon="ion-help-buoy" ui-sref="tabs.tab3"> <ion-nav-view name="tabs-tab3"></ion-nav-view> </ion-tab> </ion-tabs> </ion-view>
您可以查看它的工作原理here.
我想我们应该开个问题.