2019独角兽企业重金招聘Python工程师标准>>>

在路由的切换过程中,Ember路由器会通过回调(beforeModel、model、afterModel、redirect)解析一个transition对象到切换的下一路由中。任何一个回调都可以通过传递过来的transition参数获取transition对象,然后使用这个对象调用transition.abort()方法立即终止路由的切换,如果你的程序保存了这个对象(transition对象)之后你还可以在需要的地方取出来并调用transition.retry()方法激活路由切换这个动作,最终实现路由的切换。

1,通过调用willTransition方法阻止路由切换

当用户通过{{link-to}}助手、transition方法或者直接执行URL来切换路由,当前路由会自动执行willTransition方法。每个活动的路由都可以决定是否执行切换路由。

想象一下,在当前路由所渲染的页面是一个比较复杂的表单,并且用户已经填写了很多信息,但是用户很可能无意中点击了返回或者关闭页面,这就导致了用户填写的信息直接丢失了,这样的用户体验并不好。此时我们可以通过使用willTransition方法阻止用户的行为并提示用户是否确认离开本页面。

为了验证这个特性我们需要创建好测试所需的文件。

ember g controller form

ember g route form

首先在controller增加测试数据。

//  app/controllers/form.jsimport Ember from 'ember';export default Ember.Controller.extend({firstName: 'chen',lastName: 'ubuntuvim'
});

再创建一个模拟用户填写信息的模板。

<form><div><label for="exampleInputEmail1">FirstName</label>{{input type="text" id="exampleInputEmail1" placeholder="FirstName" value=firstName}}</div><div><label for="exampleInputPassword1">LashName</label>{{input type="text" id="exampleInputPassword1" placeholder="LashName" value=lastName}}</div><button type="submit" class="btn btn-primary">Submit</button>
</form><br><br>
{{#link-to 'about'}}<b>转到about</b>{{/link-to}}

关键部分来了,我们在路由里添加willTransition方法。

//  app/routes/form.jsimport Ember from 'ember';export default Ember.Route.extend({actions: {willTransition: function(transition) {//  如果是使用this.get('key')获取不了页面输入值,因为不是通过action提交表单的var v = this.controller.get('firstName');//  任意获取一个作为判断表单输入值if (v && !confirm("你确定要离开这个页面吗??")) {transition.abort();} else {return true;}}}
});

运行:http://localhost:4200/form,先点击“submit”提交表单,可以看到表单顺利提交没有任何问题,然后再点击“转到about”,你可以看到会弹出如下提示框。

接着,点击“取消”页面没有跳转,如果是点击“确定”页面会跳转到about页面。

再接着,把FirstName这个输入框的内容清空然后点击“转到about”页面直接跳转到了about页面。

很多博客网站都是有这个功能的!!

2,在beforeModel、model、afterModel回调中阻止路由切换

beforeModel(transition) {if (new Date() > new Date('January 1, 1980')) {alert('Sorry, you need a time machine to enter this route.');transition.abort();}
}

这段代码演示的就是在beforeModel回调中使用abort方法阻止路由的切换。代码比较简单我就不做例子演示了!

3,路由会跳(retrying)

文件准备工作:

ember g controller auth

ember g route auth

ember g controller login

ember g route login

下面是演示用到的代码。

//  app/controllers/login.jsimport Ember from 'ember';export default Ember.Controller.extend({userIsLogin: false,actions: {// 获取跳转过来之前路由中设置的transition对象var transitionObj = this.get('transitionObj');if (transitionObj) {this.set("transitionObj", null);this.set('userIsLogin', true);  // 登录成功的标记transitionObj.retry();  //  回到登录前的页面} else {//  转回首页this.transitionToRoute('index');}}
});
//  app/routes/auth.jsimport Ember from 'ember';export default Ember.Route.extend({beforeModel(transition) {// 在名为auth的controller设置了userIsLogin为false,默认是未登录if (!this.controllerFor("login").get('userIsLogin')) {var loginController = this.controllerFor("login");// 保存transition对象loginController.set("transitionObj", transition);console.log('未授权转到登录页面...');this.transitionTo("login");  // 跳转到路由login} else {}}
});
<!--  //app/templates/login.hbs --><form {{action 'login' on='submit'}}><div class="form-group"><label for="exampleInputEmail1">FirstName</label>{{input type="text" class="form-control" id="exampleInputEmail1" placeholder="FirstName" value=username}}</div><div class="form-group"><label for="exampleInputPassword1">LashName</label>{{input type="text" class="form-control" id="exampleInputPassword1" placeholder="LashName" value=password}}</div><button type="submit" class="btn btn-primary">Submit</button>
</form>
{{! app/templates/auth.hbs}}授权页面,登录才能看,并且登录成功后调回到这里。。。

这4段代码模拟一个需要授权才能查看的页面,还没登录的用户会跳转到登录页面,登录成功之后会跳转会到登录前的查看的授权页面。

这种方式在很多的网站都使用到,是一个非常常见的功能。

转载于:https://my.oschina.net/ubuntuvim/blog/511599

Ember.js 入门指南——路由切换的终止和回跳相关推荐

  1. Ember.js 入门指南——路由重定向

    2019独角兽企业重金招聘Python工程师标准>>> 声明:对于transition这个词直译是"过渡"的意思,但是总觉得"路由的过渡"读起 ...

  2. Ember.js 入门指南——番外篇,路由、模板的执行、渲染顺序

    2019独角兽企业重金招聘Python工程师标准>>> 在Ember中路由和模板的执行都是有一定顺序的,它们的顺序为:主路由à子路由1à子路由2à子路由3à--.模板渲染的顺序与路由 ...

  3. Ember.js 入门指南——查询记录

    2019独角兽企业重金招聘Python工程师标准>>> store提供了统一的获取数据的接口.包括创建新记录.修改记录.删除记录等,更多有关Store API请看这个网址的介绍:ht ...

  4. Ember.js 入门指南——定义模型

    2019独角兽企业重金招聘Python工程师标准>>> model也是一个类,它定义了向用户展示的属性和数据行为.model的定义非常简单,只需要继承DS.Model类即可,或者你也 ...

  5. Ember.js 入门指南——handlebars属性绑定

    2019独角兽企业重金招聘Python工程师标准>>> 本文从http://www.ibeginer.sinaapp.com迁移过来,欢迎访问原页面. 简单讲属性绑定其实就是在HTM ...

  6. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南--类的定义.初始化.继承 Ember.js 入门指南--类的扩展(reopen) Ember.js 入门指南--计算属性(compute properti ...

  7. d3.js 入门指南 - 仪表盘

    D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js. ...

  8. d3.js 入门指南

    说到数据可视化,我们会行到很多优秀的框架,像echarts.highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需 ...

  9. Three.js入门指南

    1.threejs导入3d模型到web端,3d模型的文件格式可以找个建模软件转化为threejs所支持的格式,如.dae .obj .mtl stl gld等 harp.gl 3D地图渲染引擎 key ...

最新文章

  1. compser可以检查php扩展吗,composer扩展
  2. 获取iPhone通话记录(需越狱)
  3. 【错误记录】Android Studio 创建 Flutter 应用被卡住 ( 更新 Flutter 插件 | 命令行创建 | 断网 )
  4. WPF 窗口居中 变更触发机制
  5. python 处理excel
  6. Effective Java之考虑自定义的序列化模式(七十五)
  7. 修改Sublime Text3左侧导航字号大小及行高
  8. SAP UI5应用Opportunity S5 formatter issue
  9. IBM x3650 光盘安装linux,IBM X3650 M3服务器安装SUSE LINUX 10实战
  10. SQL SERVER数据类型与C#数据类型对照表
  11. oracle监听器无法启动,提示“错误1067:进程意外终止”
  12. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_11-freemarker静态化测试-基于模板字符串静态化...
  13. GB28181移植总结
  14. RIPv2的认证(Enabling RIPv2 Autherization)
  15. sublime快捷键生成html5基本模板
  16. 计算机网络技术计划书,开设计算机网络技术专业项目可研计划书5喜欢就下吧(样例3)...
  17. 一次Nginx 502问题解决
  18. 计算机排线知识,宏利工程师为您讲解笔记本电脑触摸板软排线FFC的知识点[宏利]...
  19. 做京东运营2年的感悟(转自派代网 乔先生)
  20. python计算纪念日相关

热门文章

  1. ITK:多输入不同的类型
  2. VTK:网格之MatrixMathFilter
  3. VTK:IO之ExportPolyDataScene
  4. OpenCV距离变换和分水岭算法的图像分割
  5. 从C ++定义QML类型
  6. OpenGL 2D Prefix Sum 2维前缀总和的实例
  7. redis的基本使用笔记二
  8. C语言*在变量前 **p,C语言之指针*p++和*(p++)区别
  9. 「C++」C++ Primer Plus 笔记:第一章 预备知识
  10. Knox网关、网关简介、概述、支持的Apache Hadoop服务、支持的Apache Hadoop生态系统的UI、参考资料