Pages 页面(Pages)


Pages - 和你在网页中打开的页面是同样的意思.

  1. <body>
  2. ...
  3. <!-- Views -->
  4. <div class="views">
  5. <!-- Your main view -->
  6. <div class="view view-main">
  7. <!-- Pages -->
  8. <div class="pages">
  9. <div class="page" data-page="home">
  10. <div class="page-content">
  11. ... page content goes here ...
  12. </div>
  13. </div>
  14. </div>
  15. </div>
  16. <!-- Another view -->
  17. <div class="view another-view">
  18. <!-- Pages -->
  19. <div class="pages">
  20. <div class="page" data-page="home-another">
  21. <div class="page-content">
  22. ... page content goes here ...
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. ...
  29. </body>

<div class="pages"> 是page在同一个View中的容器. Pages 是必须的,因为所有的页面切换都在这里。

几个重要的提示

  • 在 main layout(index.html) 中,每一个 Page 都应该放在 Pages 容器中(<div class="pages">),而 Pages 必须是 View 的子元素(<div class="view">)。

data-page

你会发现每一个 page 都有一个 data-page 属性,存储了一个唯一的page名。这个属性不是必须的,但是强烈推荐使用。

这个属性在 page 事件中或者在page 回调函数中会非常有用,可以用来帮助我们确定加载的是哪一个页面。

Page 内容

所有的可见的内容,比如列表和表单等,都应该放在 <div class="page-content"> 中,她是 <div class="page"> 的子元素。这样才能保证正确的样式,布局和滚动。

Page 事件

现在我们看看页面浏览的时候最重要的一部分 - Page 事件。这些事件可以让我们通过JS来操作加载好的Page。

Event Target Description
pageBeforeInit Page Element<div class="page"> 当Framework7把新页面插入DOM的时候会触发
pageInit Page Element<div class="page"> 当Framework7初始化页面的组件的时候会触发
pageReinit Page Element<div class="page"> This event will be triggered when cached page becomes visible. It is only applicaple for Inline Pages (DOM cached pages)
pageBeforeAnimation Page Element<div class="page"> 当页面初始化完成并且可以做动画的时候触发
pageAfterAnimation Page Element<div class="page"> 在页面动画完成之后触发
pageBeforeRemove Page Element<div class="page"> Page从DOM中移除之前就会触发这个事件。如果你希望做一些解除事件绑定或者销毁一些插件的时候,这个方法是很有用的。
pageBack Page Element<div class="page"> 在返回上一页动画执行之前就会触发这个事件。和 "pageBeforeAnimation" 的不同之处在于,这个事件在老页面上也会触发,也就是那个从中间滑动到右边的页面。
pageAfterBack Page Element<div class="page"> 返回上一页动画执行完成之后触发这个事件。同样,区别于"pageAfterAnimation",他也会在老页面上触发。

有两种方式可以使用这些事件:

  1. // Option 1. Using one 'pageInit' handler for all pages (recommended way):
  2. $$(document).on('pageInit', function (e) {
  3. // Do something here when page loaded and initialized
  4. })
  5. // Option 2. Using live 'pageInit' event handlers for each page (not recommended)
  6. $$(document).on('pageInit', '.page[data-page="about"]', function (e) {
  7. // Do something here when page with data-page="about" attribute loaded and initialized
  8. })

但是如果我们只用一个handler,如果确定我们加载到的页面到底是哪一个呢?为了解决这个问题,我们在事件中提供了一个详细的数据:

Page 数据

在 Page 事件中,event实例中包含了关于当前Page非常详细的数据:

  1. // Option 1. Using one 'pageInit' handler for all pages (recommended way):
  2. $$(document).on('pageInit', function (e) {
  3. // Page Data contains all required information about loaded and initialized page
  4. var page = e.detail.page;
  5. })

在上面的例子中,我们有一个 page 变量存储了页面数据。这个变量是一个对象,有如下属性:

Page Data Properties
page.name 就是 data-page 设定的名称
page.url 当前页面的URL
page.query 当前页面的get参数,是一个对象。假设你的页面URL是 "about.html?id=10&count=20&color=blue",那么query就是:
  1. {
  2. id: '10',
  3. count: '20',
  4. color: 'blue'
  5. }
page.view object. 包含当前页面的view对象(前提是view已经初始化完成)
page.container Page 对应的 HTMLElement
page.from string 当前页面从哪个方向加载进来。如果是新加载的页面,则为"right",如果是返回上一步的页面,则为"left"
page.navbarInnerContainer navbar-inner" 对应的 HTMLElement,只有动态导航栏才有。
page.swipeBack boolean。当前页面是否是滑动返回的。只有在 onPageBefore/AfterAnimation 回调函数/事件 中才可以访问。
page.context object. 这个页面的 Template7 上下文
page.fromPage object. 上一个页面的pageData

我们就可以在一个handler中处理不同的页面了:

  1. $$(document).on('pageInit', function (e) {
  2. var page = e.detail.page;
  3. // Code for About page
  4. if (page.name === 'about') {
  5. // We need to get count GET parameter from URL (about.html?count=10)
  6. var count = page.query.count;
  7. // Now we can generate some dummy list
  8. var listHTML = '<ul>';
  9. for (var i = 0; i < count; i++) {
  10. listHTML += '<li>' + i + '</li>';
  11. }
  12. listHTML += '</ul>';
  13. // And insert generated list to page content
  14. $$(page.container).find('.page-content').append(listHTML);
  15. }
  16. // Code for Services page
  17. if (page.name === 'services') {
  18. myApp.alert('Here comes our services!');
  19. }
  20. });

下一步

现在我们必须要理解 页面之间的路由 是如何工作的。另外,也需要看看 Page 回调函数,这样我们可以不用事件,而通过回调函数来做一些操作。