加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 控制器使用ui-router嵌套状态(Ionic)执行两次

发布时间:2020-12-17 16:56:44 所属栏目:安全 来源:网络整理
导读:问题 我的Ionic应用程序允许您从侧面菜单中选择一个项目,然后在主要内容区域中显示两个选项卡(任务,消息).任务和消息选项卡是项目的嵌套状态. 当您在侧面菜单中更改项目时,TaskListCtrl将执行两次.在项目之间切换时,请参阅live demo并观察控制台.我还有一个v
问题

我的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',$stateParams) {
  $scope.tasks = $scope.project.tasks;

  console.log('t=> TaskListCtrl')
  console.log('tt=> $stateParams: ',$stateParams)
  console.log('tt=> $scope.tasks[0].title: ',$scope.tasks[0].title)
})

资源

> Live demo(在项目之间切换时观察控制台日志)
> Video showing the issue
> Code on GitHub

笔记

>我知道StackOverflow上有类似的问题 – 但是,他们提供的解决方案都没有解决我的问题.*
>我已经读过,当在$stateProvider和ng-controller中连接控制器时会发生这种情况 – 但是,我已经检查过,我不是这样做的.我只用$stateProvider附加控制器.

解决方法

我猜 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.

我想我们应该开个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读