【问题标题】:Controller executing twice with ui-router nested states (Ionic)控制器使用 ui-router 嵌套状态执行两次(离子)
【发布时间】:2015-07-13 20:08:13
【问题描述】:

问题

My 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的相关sn-p:

.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)
})

资源

注意事项

  • 我知道 StackOverflow 上有类似的问题 - 但是,他们提供的解决方案都没有解决我的问题。*
  • 我已经读到在 $stateProviderng-controller 中附加控制器时可能会发生这种情况 - 但是,我已经检查过 我没有这样做。 我只是使用$stateProvider 附加控制器。

【问题讨论】:

  • 除了进行深度调试会话并确保您的选项卡没有被调用两次之外,我没有任何建议。我以前被奇怪的路由和角度标签咬住了。基本上发生的情况是选项卡将一直更改状态到最后一个选项卡,然后反弹回第一个选项卡。这可能不是您的问题,但由于您已经用尽了几乎所有其他途径,因此可能值得一看。
  • 谢谢 - 知道我没有忽略一些简单的事情,这让人放心。我将深入研究这些标签,看看我能找到什么。

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


【解决方案1】:

我猜tuckerjt07 是对的。

这似乎是路由和参数以及离子选项卡的问题。 我几乎一整天都在试图弄清楚发生了什么。

我认为问题在于您使用带有参数的抽象控制器,但这不是问题。

我检查了侧边菜单是否干扰了选项卡,但同样,问题不存在。

我已经检查了范围,试图使用controllerAs 消除摩擦并避免引用 $scope 对象来存储视图模型,但是......什么也没有。

我已经创建了您的应用程序的简化版本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

我想我们应该打开一个问题。

【讨论】:

  • 感谢您深入挖掘并提出问题。作为一个离子新手,我会永远走这么深。注意:问题在 GitHub github.com/driftyco/ionic/issues/4089
  • @KyleFox:很高兴我在某种程度上提供了帮助。几天前我回答了类似的question。似乎很多人发现很难使用导航/子导航和历史。希望有人能解决这个问题。干杯。
猜你喜欢
  • 2016-12-06
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多