Ember.js 入门指南——路由切换的防止和重试

在路由的切换过程中,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.js
 
import 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.js
 
import 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,存储transition对象、路由切换重试

对于使用abort方法终止的路由可以调用retry方法重新激活。一个很典型的例子就是登陆。如果登陆成功就转到首页,否则跳转回登陆页面。

文件准备工作:

ember g controller auth

ember g route auth

ember g controller login

ember g route login

下面是演示用到的代码。

//  app/controllers/login.js
 
import Ember from ‘ember‘;
 
export default Ember.Controller.extend({
       actions: {
              login: function() {
          //  获取跳转过来之前路由中设置的transition对象
                     var transitionObj = this.get(‘transitionObj‘);
                     console.log(‘transitionObj = ‘ + transitionObj);
                     if (transitionObj) {
                            this.set("transitionObj", null);
                            transitionObj.retry();
                     } else {
                            //  转回首页
                            this.transitionToRoute(‘index‘);
                     }
              }
       }
});
//  app/controllers/auth.js
 
import Ember from ‘ember‘;
 
export default Ember.Controller.extend({
       userIsLogin: false
});
//  app/routes/auth.js
 
import Ember from ‘ember‘;
 
export default Ember.Route.extend({
       beforeModel(transition) {
              // 在名为auth的controller设置了userIsLogin为false,默认是未登录
              if (!this.controllerFor("auth").get(‘userIsLogin‘)) {
                     var loginController = this.controllerFor("login");
                     // 保存transition对象
                     loginController.set("transitionObj", transition);
                     this.transitionTo("login");  // 跳转到路由login
              }
       }
});
<!--  //app/templates/login.hbs -->
 
这个是登陆页面

1,先执行http://localhost:4200/auth,然后界面会自动跳转到login页面,结果显示如下:

可以看到URL确实是转到login了。

2,执行http://localhost:4200/login,你会发现页面直接跳转到首页,浏览器控制台打印的transitionObj是undefined。由于没有经auth这个路由的跳转所以获取不到transition对象。自然就跳转回index这个路由。

时间: 2024-12-15 07:12:52

Ember.js 入门指南——路由切换的防止和重试的相关文章

Ember.js 入门指南——路由简介

从本文开始,将为大家介绍路由(route),如果你看过前面的<Ember.js 入门指南--{{link-to}} 助手>这篇文章应该初步了解了route.不过在这篇文章中只是简单介绍了路由是定义.路由层次,更深入的route将从本文开始逐一介绍. 当用户使用你的应用时,应用要在不同的状态之间切换.Ember提供了很多工具用于管理那些因应用规模改变而改变的状态. 讲route前先了解URL,在应用中大概会会有如下方式设置URL: 用户第一次加载应用的时: 用户手动改变URL,比如点击按钮之后跳

Ember.js 入门指南——路由定义

当你的应用启动的时候,路由器就会匹配当前的URL到你定义的路由上.然后按照定义的路由层次逐个加载数据.设置应用程序状态.渲染路由对应的模板. 1,基本路由 在app/router.js的map方法里定义的路由会映射到当前的URL.当map方法被调用的时候方法体内的route方法就会创建路由. 下面使用Ember CLI命令创建两个路由: ember generate route about ember generate route favorites 命令执行完之后你可在你的项目目录app/ro

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

声明:对于transition这个词直译是"过渡"的意思,但是总觉得"路由的过渡"读起来总有那么一点别扭,想了下于是就用"切换"替代吧,如有不妥欢迎指正. 我们熟知的Java.PHP等语言都提供了URL的重定向,那么Ember的重定向又是怎么去实现的呢? 如果是从路由重定向到另外一个路由你可以调用transitionTo方法重定向到另一个路由,如果是从controller重定向到一个route你可以调用transitionToRoute方法.tr

Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Ember: Ember是一个雄心勃勃的Web应用程序,消除了样板,并提供了一个标准的应用程序架构的JavaSc

Ember.js 入门指南——异步路由

本文将为你介绍路由的高级特性,这些高级特性可以用于处理项目复杂的异步逻辑. 关于单词promises,直译是承诺,但是个人觉得还是使用原文吧.读起来顺畅点. 1,promises(承诺) Ember的路由处理异步逻辑的方式是使用promises.简而言之,promises就是一个表示最终结果的对象.这个对象可能是fulfill(成功获取最终结果)也可能是reject(获取结果失败).为了获取这个最终值,或者是处理promises失败的情况都可以使用then方法,这个方法接受两个可选的回调方法,一

Ember.js 入门指南——控制器(controller)

ember new chapter5_controllers cd chapter5_controllers ember server 从本篇开始进入第五章控制器,controller在Ember2.0开始越来越精简了,职责也更加单一--处理逻辑. 下面是准备工作. 从新创建一个Ember项目,仍旧使用的是Ember CLI命令创建. 在浏览器执行项目,看到如下信息说明项目搭建成功. Welcome to Ember 1,控制器简介 控制器与组件非常相似,由此,在未来的新版本中很有可能组件将会完

Ember.js 入门指南——model简介2

本文接上一篇<Ember.js 入门指南--model简介1>. 2,核心概念 声明:下面简介内摘抄至http://www.emberjs.cn/guides/models/#toc_. 1,store store是应用存放记录的中心仓库.你可以认为store是应用的所有数据的缓存.应用的控制器和路由都可以访问这个共享的store:当它们需要显示或者修改一个记录时,首先就需要访问store. DS.Store的实例会被自动创建,并且该实例被应用中所有的对象所共享. store可以看做是一个缓存

Ember.js 入门指南--目录

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Emb

Ember.js 入门指南——模板渲染

路由的另一个重要职责是渲染同名字的模板. 比如下面的路由设置,posts路由渲染模板posts.hbs,路由new渲染模板posts/new.hbs. Router.map(function() {      this.route('posts', function() {      this.route('new');   }); }); 每一个模板都会渲染到父模板的{{outlet}}上.比如上面的路由设置模板posts.hbs会渲染到模板application.hbs的{{outlet}}