Ember.js使用一个运行时解析器去连接你的对象而没有很多样板文件。作为一个开发者,如果你把code放到约定好的位置这个解析器会自动工作。
 
一、The Application
    1. 当你的app启动时,Ember.js将渲染application template作为主要模板。
 
     2. 如果提供了controller:application, Ember.js将设置一个controller:application的实例作为template的controller。这意味着,这个template将从controller中获取属性。
 
    3. 如果app提供了一个路由app/routes/application.js,Ember.js将在加载application template之前先调用这个路由的挂钩。
       钩子作为方法被实现,在Ember对象的生命周期内,它们提供访问点通过拦截和执行代码去修改这些访问点的默认行为来满足你的需求。
       Ember为了各种各样的目的提供了许多可用的hooks。
 
    4. example:
  下面是一个使用route,controller和template的简单的例子:
  • app/routes/application.js
  1. export default Ember.Route.extend({
  2. model() {
  3. return { title: "Hello World" };
  4. }
  5. });
  • app/controllers/application.js
  1. export default Ember.Controller.extend({
  2. appName: 'My First Example'
  3. });
  • app/templates/application/hbs
  1. <h1>{{appName}}</h1>
  2. <h2>{{model.title}}</h2>

5. 在Ember.js应用程序中,你总会提供你的对象作为类,框架负责实例化它们并通过运行时解析器把它们提供给templates。

二、Simplement Routes(简单路由)

1. 每一个route都会有一个和它名字相同的controller和template。

2. A simple router:

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('favorites');
  5. });
  6.  
  7. export default Router;
  • 如果你的用户导航到/favorites,Ember.js将会在你的项目中需找下面这些类:

    • app/routes/favorites.js
    • app/controllers/favorites.js
    • app/templates/favorites.js
  • Ember.js将会把favorites template加载到application template{{outlet}}中。它将会设置一个controller:favorites的实例作为templatecontroller
  • 如果你的app提供了一个route:favorites,这个框架会在加载template之前调用它。

3. 对于一个类似route:favorites这样的路由,你可能会实现model hook去指定你的controller将会把哪个model展现到模板。

example:

  1. import ajax from 'ic-ajax';
  2.  
  3. export default Ember.Route.extend({
  4. model() {
  5. //the model is an Array of all of the posts
  6. //fetched from this url
  7. reutrn ajax('/a/service/url/where/posts/live');
  8. }
  9. });
  • 在这个例子中,我们没有提供一个controller:favorites。因为model是一个数组,Ember.js会自动提供一个Ember.ArrayController的实例,它会展现backing Array作为它的模型。
  • 你可以把Ember.ArrayController看做犹如模型本身。这么做的好处就是,你可以随时更换controller的model,而无需直接通知模板和组件的变化。

4. template可以遍历控制器的元素:

  1. <ul>
  2. {{#each controller as |item|}}
  3. <li>{{item.title}}</li>
  4. {{/each}}
  5. </ul>

三、动态段(a URL that includes a parameter)

如果route使用动态段(一个包含参数的URL),路由的model将会基于用户提供的动态段的值。

1. 考虑一下这个路由定义

app/router.js

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('post', { path: '/posts/:post_id' });
  5. });
  6.  
  7. export default Router
  • 在这个例子中,route的名字是post,所以Ember.js将会查找这些对象:

    • app/routes/post.js
    • app/controllers/post.js
    • app/templates/post.hbs

2. 路由的处理程序的model hook会把动态参数:post_id转换进model中。serialize hook把一个模型对象转换回这个路由的URL参数(例如,为模型对象生成一个link)。

app/routes/post.js

  1. import ajax from 'ic-ajax'
  2.  
  3. export default Ember.Route.extend({
  4. model(params) {
  5. return ajax('/my-service/posts/' + params.post_id);
  6. },
      
  7. serialize(post) {
  8. return { post_id: Ember.get(post, 'id') };
  9. }
  10. });

3. 因为这种现象非常普遍,它是默认的路由处理程序。

  • 如果动态字段以_id结尾,默认的model hook将把第一部分转换为应用程序命名空间中的一个模型类(post looks for app/models/post.js)。然后它会调用类中的find获得动态字段的值。
  • serialize hook的默认行为是用model objectid属性的值替换route的动态字段。

四、 Route,Controller和Template Defaults

1. 如果你没有为post route(app/routes/post.js)指定一个路由处理器,Ember.js仍然会使用app的app/controllers/post.js实例去渲染app/templates/post.hbs模板。

2. 如果你没有指定controller(app/controllers/post.js),Ember将会基于routemodel hook返回的值生成一个。如果model是一个Array,你会得到一个ArrayController。或则,你会得到一个ObjectController

3. 如果你没有指定一个post模板,Ember.js什么都不会渲染。

五、Nesting(嵌套)

你可以嵌套路由:

app/router.js

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('posts', function() { //the 'posts' route
  5. this.route('favorites'); //the 'posts.favorites' route
  6. this.route('post'); //the 'posts.post' route
  7. });
  8. });
  9.  
  10. export default Router

下面是这个路由器中每个route的命名约定:

六、The Index Route

在每个级别的嵌套(包括顶层),Ember.js自动为路径"/"提供一个名为indexroute

1. example:

app/router.js

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('favorites');
  5. });
  6.  
  7. export default Router;

这相当于:

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('index', { path: '/' });
  5. this.route('favorites');
  6. });
  7.  
  8. export default Router;

如果用户访问'/',Ember.js将会查找这些对象:

  • app/routes/index.js
  • app/controllers/index.js
  • app/templates/index.hbs

index模板将会渲染到application模板的{{outlet}}中。如果用户导航到/favorites,Ember.js将会使用favorites template替换index template

2. 一个嵌套的路由器

app/router.js

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('posts', function () {
  5. this.route('favorites');
  6. });
  7. });
  8.  
  9. export default Router;

这相当于:

app/router.js

  1. var Router = Ember.Router.extend();
  2.  
  3. Router.map(function () {
  4. this.route('index', { path: '/' });
  5. this.route('posts', function () {
  6. this.route('index', { path: '/' });
  7. this.route('favorites');
  8. });
  9. });
  10.  
  11. export default Router;

如果用户导航到/posts,当前路由将会是posts.index,Ember.js将会查找以下objects:

  • app/routes/posts/index.js
  • app/routes/posts/index.js
  • app/templates/posts/index.hbs

首先,posts模板将会被渲染到application模板的{{outlet}}中。然后,posts/index模板将会被渲染到posts模板的{{outlet}}中。

如果用户导航到posts/favorites,Ember.js将会用posts/favorites模板替换posts模板中的{{outlet}}

1.2 Getting Started--Naming Conventions(命名约定)的更多相关文章

  1. Effective Java 56 Adhere to generally accepted naming conventions

    Typographical naming conventions Identifier Type Type Examples Package com.google.inject, org.joda.t ...

  2. Naming Conventions for .NET / C# Projects

    http://www.akadia.com/services/naming_conventions.html Naming Conventions for .NET / C# Projects Mar ...

  3. C# Coding & Naming Conventions

    Reference document https://msdn.microsoft.com/en-us/library/ff926074.aspx https://msdn.microsoft.com ...

  4. Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)

    依赖管理(Dependency Management)和命名规范(Naming Conventions) 依赖管理和依赖注入(dependency injection)是有区别的.为了将Spring的 ...

  5. JavaScript Patterns 2.10 Naming Conventions

    1. Capitalizing Constructors var adam = new Person(); 2. Separating Words camel case - type the word ...

  6. Naming conventions of python

    1.package name 全部小写字母,中间可以由点分隔开,作为命名空间,包名应该具有唯一性,推荐采用公司或组织域名的倒置,如com.apple.quicktime.v2 2.module nam ...

  7. Stackoverflow/dapper的Dapper-Extensions用法(一)

    Dapper-Extensions Dapper Extensions is a small library that complements Dapper by adding basic CRUD ...

  8. Objective-C文章中的生词

    Objective-C http://rypress.com/tutorials/objective-c/index C Basics    http://rypress.com/tutorials/ ...

  9. ExtJS笔记2 Class System

    For the first time in its history, Ext JS went through a huge refactoring from the ground up with th ...

随机推荐

  1. TTCN中PTC的执行流程

    一些概念 Component(測试组件或者測试成分),TTCN接触下来最频繁的就是MTC(Main Test Component,主測试组件),在执行測试用例前,须要首先创建一个MTC.在testca ...

  2. iOS-WKWebView使用

    使用代码:可直接粘贴到自己项目中使用 .h #import "BaseViewController.h" @interface LinkNewsController : BaseV ...

  3. day10<面向对象+>

    面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四 ...

  4. android中用studio更改包名

    Android Studio,咱们开发安卓的利器,自推出就受到移动开发者的追捧,但一路走来,大家谈到他,充满了兴奋之情之余,也略显羞涩.随版本自推出以来,不断完善BUG,但咱们还是深深地踩了进去,说多 ...

  5. vertical-align负值和margin-bottom负值的区别

    先看一下vertical-align在W3C当中的值有哪一些: 可是它有数值这一说确实很少提起,我们来看这么一段代码: <!DOCTYPE html> <html lang=&quo ...

  6. js array.filter实例(数组去重)

    语法: 循环对数组中的元素调用callback函数, 如果返回true 保留,如果返回false 过滤掉,  返回新数组,老数组不变 var new_array = source_array.filt ...

  7. php数据访问之查询关键字

    本文根据数据库中的car表做一个汽车查询页面,巩固php查询关键字操作,感兴趣的小伙伴们可以参考一下   本文实例为大家分享了php查询操作的实现代码,供大家参考,具体内容如下 一.一个关键字查询 主 ...

  8. Java三方---->excel框架之POI的使用一

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.pdf框架之IText的使用,参见我的博客:Java ...

  9. Excel 2010 如何快速统计一列中相同数值出现的个数 很不错

    https://jingyan.baidu.com/article/9113f81b2c16822b3214c785.html 最近经常看到论坛和百度知道的朋友提问关于“excel中如何快速统计一列中 ...

  10. ts和js中let和var定义变量的区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”JavaScript 严格模式”,比如下述的代码运行就会报错: let hello = 'hello worl ...