`

EmberJS 命名约定

阅读更多

    EmberJS 用了一系列的命名约定,使得各个对象(application,router,model,template...)联系起来。好处是,避免写烦人的简单代码。

    下面的说明 都基于:我们的应用取名 App,

THE APPLICATION

    在应用启动后,Ember自动找App的三个内容:

     1. App.ApplicationRoute  (路由,为了获得数据 )

     2.App.ApplicationController ( 控制器)

     3. application 的模板

     如果找到名称是application的模板,把 ApplicationController 的实例(单例) 与模板绑定,模板可以通过controller属性访问ApplicationController  。

     如果找到了ApplicationRoute  ,那么,在展示模板前,会先执行ApplicationRoute  中的一些钩子, 钩子可以看成一个拦截器,对一个Route对象,定义的钩子有model, setupController. 下面是个例子:

   

App.ApplicationRoute = Ember.Route.extend({
  setupController: function(controller) {
    // `controller` is the instance of ApplicationController
    controller.set('title', "Hello world!");
  }
});

App.ApplicationController = Ember.Controller.extend({
  appName: 'My First Example'
});

 

<!-- application template -->
<h1>{{appName}}</h1>

<h2>{{title}}</h2>

 

SIMPLE ROUTES

    对于每一个路由,Ember认为都会有一个控制器,以及相同名字的模板。例如,下例定义了一个路由 favorites

 

App.Router.map(function() {
  this.route('favorites');
});

     对应 favorites 这个路由,Ember将查找以下三个内容

    1.App.FavoritesRoute

     2. App.FavaritesController

     3. 名称叫 favorites 的模板

     Ember 会把 favorites的内容填到application模板中的{{outlet}}中,并把FavoritesController的实例作为模板的controller属性。

     如果给出了 FavoritesRoute, 在渲染模板前,先实例化FavoritesRoute(用来准备数据)

 

App.FavoritesRoute = Ember.Route.extend({
  model: function() {
    // the model is an Array of all of the posts
    return this.store.find('post');
  }
});

 

 

   在上面的例子中,没有指定FavoritesController, 但 Ember 判断到 model 是一个数组,所以会把 ArrayController 与模板绑定,在模板中可以这样写

  

<ul>
{{#each controller}}
  <li>{{title}}</li>
{{/each}}
</ul>

 

 

DYNAMIC SEGMENTS(route)

    动态的段(路由),对应带参数的URL,比如

App.Router.map(function() {
  this.resource('post', { path: '/posts/:post_id' });
});

    与简单路由一样,Ember也同样会寻找 App.PostRoute, App.PostController ,post模板。

    App.PostRouter 例子:

App.PostRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('post', params.post_id);
  },

  serialize: function(post) {
    return { post_id: post.get('id') };
  }
});

   model方法根据post_id找到数据。serialize 方法提供了参数,该参数在model转成URL中用到。

   如果在动态段中是以_id 为结尾,model钩子会把参数前部分(post) 作为类名称,也就是认为有一个类叫App.Post, 返回的实例的类就是App.Post.

 

ROUTE, CONTROLLER AND TEMPLATE DEFAULTS

   如果一个Route 没有指定Controller,Ember依然会根据Route 返回的Model类型创建Controller. 

   1. 如果model是数组,创建ArrayController

    2.如果mode是对象,创建ObjectController

  如果没有对应的模板,会啥也不做。

NESTING(层级路由)

 

App.Router.map(function() {
  this.resource('posts', function() { // the `posts` route
    this.route('favorites');          // the `posts.favorites` route
    this.resource('post');            // the `post` route
  });
});

 

    上例定义了posts 下还有 post.favorites, posts.post 两个子路由,对于子路由,Ember依旧会找Controller,Route,及模板,比如:

Route Name Controller Route Template
posts PostsController PostsRoute posts
posts.favorites PostsFavoritesController PostsFavoritesRoute posts/favorites
post PostController PostRoute post

 

THE INDEX ROUTE

 

   每一级路由(包括顶层),Ember都会产生一个叫index 的路由,比如:

App.Router.map(function() {
  this.route('favorites');
});

    等同于:

  

App.Router.map(function() {
  this.route('index', { path: '/' });
  this.route('favorites');
});

   如果访问 / ,Ember就会找

   App.IndexRoute, AppIndexControll, index的模板。index模板会渲染到application 模板的{{outlet}}中

   

   进一步的例子:

   

App.Router.map(function() {
  this.resource('posts', function() {
    this.route('favorites');
  });
});

   等同于

App.Router.map(function() {
  this.route('index', { path: '/' });
  this.resource('posts', function() {
    this.route('index', { path: '/' });
    this.route('favorites');
  });
});

   如果访问 /posts, 那么当前的路由就是posts.index, Ember 模板  App.PostIndexRoute,App.PostIndexController,以及 posts/index 模板。posts模板会渲染到application 模板的{{outlet}}中,而posts/index模板会渲染到post模板的{{outlet}}中.

   如果该部/posts/favorites ,post/favarites模板会渲染到  post 模板的{{outlet}}中。

 

总结:

1. 每个应用应该有 controller,route,application模板

2. 每个路由,也应用相应的 controller,route,application。

   

分享到:
评论

相关推荐

    backblog:一个简单的骨干.js博客,第一次使用骨干.js

    还遵循了一些Emberjs命名约定的方式 学过的基本路由器 实施视图最佳实践 了解一点有关它如何影响DOM渲染以提高性能的信息 浏览了Chrome的Javascript内存分析 使用json-server作为临时伪造的静态API 还用js-dev-...

    EmberJs User Guide

    例如,Ember.js遵循特定的命名约定来组织代码,这样做有利于维护代码的一致性和可读性。 ### 命名约定 Ember.js框架鼓励开发者遵循一定的命名约定来定义路由、控制器、视图和模板等。这些约定帮助Ember.js框架更好...

    三大框架AngularJS、BackboneJS和EmberJS对比.pdf

    灵活性上,BackboneJS的约定最少,允许开发者自由定制,而AngularJS和EmberJS提供更完整的解决方案,可能限制了某些程度的自由度。学习曲线方面,AngularJS由于其丰富的特性,上手可能稍快,但深入理解需要时间;...

    emberjs的模版渲染

    下面将详细介绍emberjs的模板渲染及其相关概念。 1. **Router中的renderTemplate方法** `renderTemplate`方法是路由(Route)中的关键函数,它负责在路由切换时渲染对应的模板(Template)。例如,通过`this....

    Emberjs js的前端mvc框架

    它提供了一套完整的结构和约定,帮助开发者构建可维护、可扩展的前端项目。作为jQuery的有力竞争者,Ember.js旨在通过提供一套全面的工具和模式来简化Web开发流程。 在JavaScript的世界里,MVC架构是一种流行的设计...

    Flint-Store:另一个 EmberJS 项目

    EmberJS 强调约定优于配置,这意味着开发者在开始项目时可以遵循一套明确的规范,而无需过多的初始化设置。框架的核心特性包括路由器、数据管理(通过 Ember Data)、以及组件系统,这些都为构建复杂应用提供了基础...

    emberJS脚手架.zip

    emberJS脚手架 市面上vue和react的样例代码都比较多,ember资源反而比较少。 进入此代码目录 直接使用命令 "ember s" 即可进入开发状态。 编译生产代码命令 "ember b --env production

    在vs2012下使用 Emberjs

    在vs2012,vs2010下使用 Emberjs 分层结构

    website, emberjs.com 源.zip

    website, emberjs.com 源 网站 Ember.js 项目的网站。要开始:git clone https://github.com/emberjs/website.gitcd websitebundlebundle exec midd

    emberjs-jogging:EmberJS 的每日提交

    EmberJS 是一个开源的 JavaScript 框架,主要用于构建单页应用程序(SPA)。它遵循 Model-View-Controller(MVC)设计模式,提供了一套完整的框架,帮助开发者组织代码,提高开发效率,并且有着良好的社区支持和丰富...

    ember-js-docker:EmberJs的Docker映像

    ember-js-docker EmberJs的Docker映像支持的标签和相应的Dockerfile链接如何使用这张图片该映像安装了EmberJs和Chrome,从而有助于测试,运行和构建EmberJs应用程序。在您的项目中创建一个Dockerfile将以下...

    用于辅助Emberjs开发的ChromeDevTools插件

    因此,"用于辅助Emberjs开发的ChromeDevTools插件"应运而生。 这款插件专门针对Ember.js进行了优化,它能够帮助开发者更好地理解和调试Ember对象。以下是一些关键功能和知识点: 1. **Ember对象的格式化**:该插件...

    emberjs-geting-started:学习 EmberJS

    EmberJS 是一个开源的JavaScript框架,用于构建可维护性和用户体验优秀的Web应用程序。它遵循了MVC(模型-视图-控制器)模式,并且强调数据绑定、依赖注入和双向数据流,使得开发者能够更高效地构建大型复杂应用。在...

    Empress, 使用EmberJS和GitHub的简单博客.zip

    Empress, 使用EmberJS和GitHub的简单博客 Empress是一个利用 EmberJS插件和GitHub的引导博客模板。 Empress让你在 Markdown 创作你的博客文章,并使用 git ( 还有一些 ruby hackery ) 即时生成你的博客。 Empress...

    JavaScript_帮助你为Reactjs、Emberjs、Angular等选择一个MV框架Todo应用.zip

    Ember强调约定优于配置,有着严格的文件结构和命名规则。它有强大的数据绑定和路由系统,使得状态管理变得简单。Ember CLI是其命令行工具,提供了自动化构建、测试和开发环境的设置。 Angular,最初由Google开发,...

    ember-promise-button:另一个用于有状态加载按钮的 emberjs 组件

    emberjs 的另一个承诺感知组件的实现 像这样使用它: {{ #promise-button promise = myPromise loadingText = " loading " }} submit will to allah {{ /promise-button }} 这将创建一个按钮,当 myPromise 挂...

    emberjs-1.0.0.jar

    jar包,官方版本,自测可用

Global site tag (gtag.js) - Google Analytics