我的Ionic应用程序允许您从侧面菜单中选择一个项目,然后在主要内容区域中显示两个选项卡(任务,消息)。任务和消息选项卡是项目的嵌套状态。
当你在侧边菜单中更改项目时, TaskListCtrl
会被执行两次。在项目之间切换时,请查看live demo并观察控制台。我还有一个video,详细说明了这个问题。
如何阻止TaskListCtrl
执行两次?有没有更好的方法来构建这些嵌套状态?
完整代码位于GitHub »
这是我的$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', function($scope, $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)
})
$stateProvider
和ng-controller
附加控制器时可能会发生这种情况 - 但是,我已经检查过并且我没有做这个。我只使用$stateProvider
附加控制器。答案 0 :(得分:1)
我猜tuckerjt07是对的。
这似乎是路由和参数以及离子选项卡的问题。 我花了差不多一整天都想弄清楚发生了什么。
我认为问题在于您使用带参数的抽象控制器,但这不是问题。
我已经检查了侧边菜单是否干扰了标签,但是,问题还没有出现。
我已经检查了范围,尝试使用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。
我想我们应该开个问题。