Template7 页面


Framework7 可以让你使用 Template7 用特定的上下文来渲染你的ajax页面或者动态页面,并且提供了很多不同的方法来实现.

首先,我们需要在 应用初始化 的时候传入一个参数来开启这个功能:

  1. var myApp = new Framework7({
  2. template7Pages: true // enable Template7 rendering for Ajax and Dynamic pages
  3. });

这就是所有你需要做的,现在所有的Ajax和动态页面都会当做 Template7 模板来渲染,所以你可以在其中使用 Template7 语法

模板/页面 数据

现在我们需要学习的是,如何把特定的上下文传递给指定的页面。我们可以在应用初始化的时候,传入一个附加的 templateData 参数:

  1. var myApp = new Framework7({
  2. template7Pages: true, //enable Template7 rendering for pages
  3. //Specify templates/pages data
  4. template7Data: {
  5. // This context will applied for page/template with "about.html" URL
  6. 'url:about.html': {
  7. name: 'John Doe',
  8. age: 38,
  9. company: 'Apple',
  10. position: 'Developer'
  11. },
  12. // This context will applied for page/template with data-page="contacts"
  13. 'page:contacts': {
  14. tel: '(999)-111-22-33',
  15. email: 'contact@john.doe'
  16. },
  17. // Plain data object
  18. 'languages': {
  19. 'frontend': [
  20. {
  21. name:'JavaScript',
  22. description: 'Dynamic computer programming language[5]. It is most commonly used as part of web browsers, whose implementations allow...'
  23. },
  24. {
  25. name:'CSS',
  26. description: 'Style sheet language used for describing the look and formatting of a document written in a markup language...'
  27. },
  28. ],
  29. 'backend': [
  30. {
  31. name: 'PHP',
  32. description: 'Server-side scripting language designed for web development but also used as a general-purpose programming language...'
  33. },
  34. {
  35. name: 'Ruby',
  36. description: 'Dynamic, reflective, object-oriented, general-purpose programming language...'
  37. }
  38. ]
  39. }
  40. }
  41. });
  42. // Add and init View
  43. var mainView = myApp.addView('.view-main');

访问和修改 模板/页面 数据

我们可以在任何时候访问和修改 templateData。你可以通过全局的 Templates.data 属性,也可通过他的别名 myApp.templatesData 来访问

页面和URL 规则

这个很简单:

  • 如果你的属性名是以 url: 开头的,那么这个上下文会被应用在这个特定的URL对应的页面上

  • 如果你的属性名是以 page: 开头的,那么这个上下文会被用在有相同的 data-page 的页面上

推荐使用 url: 的方式来指定,因为这样检测的更准确一些。

但是,有些时候可能不能用 url:,比如你的页面有不同的GET参数(比如 about.html?id=1 和 about.html?id=2),或者是动态页面,这种情况下我们要使用 page: 规则:

对于上面定义的模板数据,我们在页面中可以这样使用:

about.html:

  1. <div class="page" data-page="about">
  2. <div class="page-content">
  3. <p>Hello, my name is {{name}} and i am {{age}} years old {{position}} at {{company}}</p>
  4. </div>
  5. </div>

contacts.html:

  1. <div class="page" data-page="contacts">
  2. <div class="page-content">
  3. <p>You can contact me:</p>
  4. <p>By phone: {{tel}}</p>
  5. <p>By email: {{email}}</p>
  6. </div>
  7. </div>

普通数据

在模板数据中定义普通数据,可能会更灵活,更容易处理。我们可以通过在链接上使用 data-context-name 属性来加和使用这些数据.

让我们看看下面这个例子,我们有一个首页,首页中有一个链接会跳转到语言列表页面,语言列表页面会有一个链接跳转到语言详情页面:

index.html:

  1. <div class="list-block">
  2. <ul>
  3. <li>
  4. <a href="languages.html" class="item-link item-content" data-context-name="languages">
  5. <div class="item-inner">
  6. <div class="item-title">Languages</div>
  7. </div>
  8. </a>
  9. </li>
  10. </ul>
  11. </div>

languages.html:

  1. <div class="page" data-page="languages">
  2. <div class="page-content">
  3. <div class="content-block-title">Frontend</div>
  4. <div class="list-block">
  5. <ul>
  6. <!-- Iterate through frontend languages -->
  7. {{#each this.frontend}}
  8. <li>
  9. <!-- As a context name for this link we pass context path from template7Data root -->
  10. <a href="language-details.html" class="item-link item-content" data-context-name="languages.frontend.{{@index}}">
  11. <div class="item-inner">
  12. <div class="item-title">{{this.name}}</div>
  13. </div>
  14. </a>
  15. </li>
  16. {{/each}}
  17. </ul>
  18. </div>
  19. <div class="content-block-title">Backend</div>
  20. <div class="list-block">
  21. <ul>
  22. <!-- Iterate through backend languages -->
  23. {{#each this.backend}}
  24. <li>
  25. <!-- As a context name for this link we pass context path from template7Data root -->
  26. <a href="language-details.html" class="item-link item-content" data-context-name="languages.backend.{{@index}}">
  27. <div class="item-inner">
  28. <div class="item-title">{{this.name}}</div>
  29. </div>
  30. </a>
  31. </li>
  32. {{/each}}
  33. </ul>
  34. </div>
  35. </div>
  36. </div>

language-details.html:

  1. <div class="page" data-page="language-details">
  2. <div class="page-content">
  3. <div class="content-block-title">{{name}}</div>
  4. <div class="content-block">
  5. <p>{{description}}</p>
  6. </div>
  7. </div>
  8. </div>

在链接上使用 data-context-name 属性可以传入 templatesData 中定义的上下文。他也支持通过上下文路径(通过使用 . 号)来访问子属性.

比如,我们可以创建一个使用上下文路径的链接指向详情页:

  1. <a href="language-details.html" data-context-name="languages.frontend.1">CSS</a>

在JS中,我们也可以使用视图的路由器的 .load() 方法和 contextName 属性:

  1. mainView.router.load({
  2. url: 'language-details.html',
  3. contextName: 'languages.frontend.0'
  4. })

传入自定义的上下文

Framework7 可以让我们在任何Ajax或者动态页面中传入自定义的上下文。

我们可以通过链接上的 data-context 属性来给任何页面传递上下文,这个属性值是一个合法的序列化的JSON字符串:

  1. <a href='contacts.html' data-context='{"tel": "(999)-111-22-33", "email": "contact@john.doe"}'>Contacts</a>

或者,在JS中,我们可以使用视图的路由器的 .load() 方法传入一个 context 属性:

  1. mainView.router.load({
  2. url: 'contacts.html',
  3. context: {
  4. tel: '(999)-111-22-33',
  5. email: 'contact@john.doe'
  6. }
  7. })

或者,我们可以指定一个 templatesData 中的普通数据:

  1. mainView.router.load({
  2. url: 'language-details.html',
  3. context: Template7.data.languages.frontend[1] // CSS
  4. })

直接加载模板

如果你使用 自动编译模板,你可以直接把他们当做动态页面渲染和加载

我们看看另一个模板,在index文件中已经定义了下面这些页面的模板:

  1. <script id="contactsTemplate" type="text/template7">
  2. <div class="page" data-page="contacts">
  3. <div class="page-content">
  4. <p>You can contact me:</p>
  5. <p>By phone: {{tel}}</p>
  6. <p>By email: {{email}}</p>
  7. </div>
  8. </div>
  9. </script>
  10. <script id="aboutTemplate" type="text/template7">
  11. <div class="page" data-page="about">
  12. <div class="page-content">
  13. <p>Hell, my name is {{name}}. I am {{age}} years old:</p>
  14. </div>
  15. </div>
  16. </script>

在我们的JS中:

  1. var myApp = new Framework7({
  2. precompileTemplates: true, //
  3. template7Pages: true, //enable Template7 rendering for pages
  4. template7Data: {
  5. // Data for contacts page
  6. 'page:contacts': {
  7. tel: '(999)-111-22-33',
  8. email: 'contact@john.doe'
  9. }
  10. }
  11. })

现在,我们需要加载这些页面。

对于 "contacts" 页面,我们在 templatesData 中已经有需要的数据。所以我们使用 data-template 属性指定模板id就行了:

  1. <!-- We need to specify template id in data-template attribute -->
  2. <a href="#" data-template="contactsTemplate">Contacts</a>

对于about页面,我们没有指定任何数据,所以我们可以传入自定义的上下文:

  1. <a href="#" data-template="aboutTemplate" data-context='{"name": "John Doe", "age": "35"}'>About Me</a>

当然,我们也可以通过JS来做,直接使用视图的 .load() 方法并传入一个 template 属性:

  1. //To load contacts page from template:
  2. mainView.router.load({
  3. template: Template7.templates.contactsTemplate // template already compiled and available as a property of Template7.templates
  4. })
  5. //To load about page from template with custom data:
  6. mainView.router.load({
  7. template: Template7.templates.aboutTemplate, // template already compiled and available as a property of Template7.templates
  8. context: {
  9. name: 'John Doe',
  10. age: 35
  11. }
  12. })

URL 参数

当我们用 template7 渲染Ajax 页面的时候,他的上下文总是会被拓展到一个包含了URL GET参数的 url_query 属性上去:

  1. <a href="person.html?firstname=John&lastname=Doe&age=33">John Doe</a>
  2. <a href="person.html?firstname=Mike&lastname=Doe&age=26">Mike Doe</a>

person.html

  1. <div class="page" data-page="person">
  2. <div class="page-content">
  3. <p>Hello, my name is {{url_query.firstname}} {{url_query.lastname}}. I am {{url_query.age}} years old.</p>
  4. </div>
  5. </div>