我可以在 onExit 中停止到下一个状态的转换吗?

2024-03-26

我有两个状态,A和B。

  • 当我通过单击关闭按钮退出状态 A 时,我使用 $state.go 转换到屏幕 A 到状态 B(屏幕 B)
  • 当我通过单击屏幕 A 上的后退浏览器按钮退出状态 A 时,随着浏览器 URL 的更改,我会转换到状态 B(屏幕 B)

在屏幕 A 的 onExit 中,我进行检查,如果失败,则会打开错误对话框,单击错误对话框上的“关闭”会向 onExit 返回失败的承诺

然而 onExit 仍然继续,我转到屏幕 B

如果 onExit 出现故障,是否可以停止从状态 A(屏幕 A)到状态 B(屏幕 B)的转换?


您可以实现您的目标$stateChangeStart https://github.com/angular-ui/ui-router/wiki#state-change-events您可以在其中取消状态转换的事件处理程序(event.preventDefault();) 需要的时候。

下面是一个复选框模拟禁用转换条件的示例。在这种情况下,在状态更改(state.go 和导航)时,它会打开一个模式,要求用户接受/拒绝被阻止的转换(某些验证检查的另一种模拟):

var myApp = angular.module('myApp', ['ui.router','ui.bootstrap']);

myApp.config(function($stateProvider, $urlRouterProvider) {

  $urlRouterProvider.otherwise('/state_a');

  $stateProvider
    .state('state_a', {
      url: '/state_a',
      templateUrl: 'stateA.html',
      onEnter: function() {
        console.log("onEnter stateA");
      },
      onExit: function($rootScope, $state) {
        console.log("onExit stateA: "+$rootScope.chk.transitionEnable);
        
      },
      controller: function($scope, $state) {
        $scope.goToStateB = function() {
          $state.go("state_b");
        }
      }
    })
    .state('state_b', {
      url: '/state_b',
      templateUrl: 'stateB.html',
      onEnter: function() {
        console.log("onEnter stateB");
      },
      onExit: function() {
        console.log("onExit stateB");
      },
      controller: function($scope) {
        
      }
    });

});

myApp.controller('mainCtrl', function($rootScope, $scope, $uibModal, $state) {

  $rootScope.chk = {};
  $rootScope.chk.transitionEnable = true;
  
  $rootScope.$on('$stateChangeStart',
    function(event, toState, toParams, fromState, fromParams, options) {
      if (!$rootScope.chk.transitionEnable) {
        event.preventDefault();
        $scope.toState = toState;
        $scope.open();
      } else {
        console.log("$stateChangeStart: "+toState.name);
      }
  })
  
  $scope.open = function () {

    var modalInstance = $uibModal.open({
      animation: $scope.animationsEnabled,
      templateUrl: 'myModal.html',
      scope: $scope,
      controller: function($uibModalInstance, $scope) {
          $scope.ok = function () {
            $uibModalInstance.close('ok');
          };
        
          $scope.cancel = function () {
            $uibModalInstance.dismiss('cancel');
          };
      },
      size: 'sm'
    });

    modalInstance.result.then(function (value) {
      console.info('Modal closed: ' + value);
        
    }, function () {
      console.info('Modal dismissed');
      $rootScope.chk.transitionEnable = true;
      $state.go($scope.toState.name);
    });
  };

});
<!DOCTYPE html>
<html>

<head>
  <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-animate.js"></script>
  <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.1.1.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.17/angular-ui-router.min.js"></script>
  <script src="app.js"></script>
</head>

<body ng-app="myApp" ng-controller="mainCtrl">

  <nav class="navbar navbar-inverse" role="navigation">
    <div class="navbar-header">
      <a class="navbar-brand" ui-sref="#">AngularUI Router</a>
    </div>
    <ul class="nav navbar-nav">
      <li><a ui-sref="state_a">State A</a></li>
      <li><a ui-sref="state_b">State B</a></li>
    </ul>
  </nav>

  <div class="container">
    <div ui-view></div>
  </div>

  <script type="text/ng-template" id="myModal.html">
    <div class="modal-header">
      <h3 class="modal-title">Title</h3>
    </div>
    <div class="modal-body">
      Transition to <b>{{toState.name}}</b> is disabled, accept or ignore?
    </div>
    <div class="modal-footer">
      <button class="btn btn-primary" type="button" ng-click="ok()">Accept</button>
      <button class="btn btn-warning" type="button" ng-click="cancel()">Ignore</button>
    </div>
  </script>
 
  <script type="text/ng-template" id="stateA.html">
  <div class="jumbotron text-center">
    <h1>state A</h1>
    <p>Example</p>
    
    <a class="btn btn-primary" ng-click="goToStateB()">Goto State B</a>
    <a class="btn btn-danger">Do nothing...</a>
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="chk.transitionEnable"> Enable transition
    </label>
    <pre>chk.transitionEnable = {{chk.transitionEnable}}</pre>
  </div>
  </script>
  
  <script type="text/ng-template" id="stateB.html">
<div class="jumbotron text-center">
    <h1>state B</h1>
    <p>The page... </p>
</div>

<div class="container">
    Bla bla
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="chk.transitionEnable"> Enable transition
    </label>
    <pre>chk.transitionEnable = {{chk.transitionEnable}}</pre>
  </div>
</div>
  </script>

</body>

</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 onExit 中停止到下一个状态的转换吗? 的相关文章

随机推荐

  • 在 AWS Cognito Oauth2 令牌中包含用户详细信息

    我正在将 AWS cognito 与 NodeJS 后端 API 结合使用 并希望在访问令牌返回中包含用户详细信息 oauth2 令牌用户池客户端应用程序中定义范围的端点 另外如果我使用管理员启动验证API 无法将范围包含在返回访问令牌中
  • Pandas date_range - 减去 numpy timedelta 给出奇怪的结果,时间变得不是 0:00:00

    我正在尝试使用 pandas date range 功能生成一组日期 然后我想迭代这个范围并从每个日期中减去几个月 确切的月份数在循环中确定 以获得新的日期 当我这样做时 我得到了一些非常奇怪的结果 MVP get date range d
  • 如何从 int 转换为泛型 Integer?

    我对 Java 比较陌生 并且习惯了 C 中的泛型 因此在处理这段代码时遇到了一些困难 基本上 我想要一个通用方法来通过按键获取存储的 Android 首选项 并且此代码虽然丑陋 但适用于布尔值 但不适用于整数 当它因 ClassCastE
  • 如何使用 Postman 查询 Exchange EWS?

    使用Postman 如何查询本地 Exchange 2016 EWS 我有 EWS 的组织 URLhttps my organization net EWS Exchange asmx 我们使用的是 Exchange 2016 没有 Off
  • 在项目之间共享自定义 PHP 代码的最佳方式

    我正在开发一个分布式环境 主要是使用 PHP 我的很多项目共享一些相同的代码 例如我的日志代码 基于 log4php 但添加了一些自定义内容 我可以在每个项目中复制粘贴此代码 但自然地 如果我更改其中的任何内容 我需要将其重新粘贴到各处并
  • 尝试创造。初始化并格式化VHD磁盘

    一些背景 我在实验室环境中工作 遇到了许多问题 需要创建 VHD 并将其附加到虚拟机以进行压力测试 我想出了一个脚本 允许用户使过程尽可能简单 如下 vms Get VM val 0 Write Host This script is se
  • 计算月份统计数据

    我有一个捐款表 我试图计算每个月的总金额 几个月没有任何捐款 我希望结果返回 0 这是我当前的查询 Donation calculate sum amount conditions gt created at gt Time now pre
  • 从服务器端应用程序向客户端推送消息?

    我有一个基于 javascript 的客户端 当前正在轮询 NET Web 服务以获取新内容 虽然轮询有效 我对这种方法不满意 因为我正在使用系统资源并在没有接收任何更改时产生开销 我的问题是如何通知我的客户有新内容可供显示 我对实施此解决
  • 使用处理的二次曲线上的点 (p5.js)

    我使用这个公式来计算二次曲线上的点 cPx2 1 t 1 t x1 2 1 t t qcX t t x2 cPy2 1 t 1 t y1 2 1 t t qcY t t y2 当我设置 t 10 并迭代曲线时 我得到 看起来它不仅获得了曲线
  • Windows 上尝试 python 多处理时出现运行时错误

    我正在 Windows 机器上使用线程和多处理来尝试我的第一个正式的 python 程序 但我无法启动进程 Python 给出以下消息 问题是 我没有在main模块 线程在类内的单独模块中处理 EDIT 顺便说一句 这段代码在 ubuntu
  • 无法使用 jQuery 委托滚动事件

    我正在尝试使用 jQuery 在特定类别的元素上触发滚动事件 如下所示 body on scroll overflow function do stuff 然而 do stuff永远不会发生 我做了一些实验 看起来好像滚动事件不能使用 on
  • 禁用 select2 清除时打开下拉菜单

    似乎 select2 4 在清除当前所选项目时默认打开下拉列表 select2 的早期版本似乎没有这种行为 我正在尝试实现它 但目前还没有运气 有谁知道如何挂钩清除事件 以便我们可以禁用它的默认行为并清除所选选项而不打开下拉列表 干杯 铝
  • 了解 Objdump 中反汇编的二进制文件 - 输出中的字段是什么

    当我使用命令 arm linux gnueabihf objdump d a out 反汇编一个简单的 ARM 二进制文件时 得到以下输出 00008480 lt start gt 8480 f04f 0b00 mov w fp 0 848
  • 返回具有 ModelState 错误的键列表

    如何返回所有有错误的键的列表 数组 我尝试执行以下操作 但它说由于某种原因我无法进行这种表达 ModelState ToList item gt item Value Errors Count gt 0 var errors from mo
  • 小书签中的 XmlHttpRequest 在 GET 上返回空响应文本?

    我正在尝试为我们构建的特殊 URL 缩短服务构建一个 javascript 书签http esv to http esv to用于缩短经文参考文献 即 马太福音 5 章 变为 http esv to Mt5 http esv to Mt5
  • Django 多列唯一约束批量插入

    假设我们有一个模型 from django db import models class Concept models Model a models CharField max length 255 b models CharField m
  • 应该以什么顺序向绝对初学者解释 Python 概念? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过移动网络的 HTTP/2 浏览器请求一次往返有多少字节?

    我正在开发一个网站 目标是尽可能快 这个目标需要让移动客户端发出初始 HTTP 请求one往返 HTTP 2 的 HPACK 应该处理同一页面的后续请求 传统观点认为 14 KB 的压缩文件response与您对网页第一次往返的预期一样多
  • 了解涉及用户定义转换的重载解析排名

    我试图理解过载解析 首先让我们考虑第一种情况 struct int1 int val operator int return val operator const int const return val void f int f 1 vo
  • 我可以在 onExit 中停止到下一个状态的转换吗?

    我有两个状态 A和B 当我通过单击关闭按钮退出状态 A 时 我使用 state go 转换到屏幕 A 到状态 B 屏幕 B 当我通过单击屏幕 A 上的后退浏览器按钮退出状态 A 时 随着浏览器 URL 的更改 我会转换到状态 B 屏幕 B