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,及模板,比如:
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。
相关推荐
还遵循了一些Emberjs命名约定的方式 学过的基本路由器 实施视图最佳实践 了解一点有关它如何影响DOM渲染以提高性能的信息 浏览了Chrome的Javascript内存分析 使用json-server作为临时伪造的静态API 还用js-dev-...
例如,Ember.js遵循特定的命名约定来组织代码,这样做有利于维护代码的一致性和可读性。 ### 命名约定 Ember.js框架鼓励开发者遵循一定的命名约定来定义路由、控制器、视图和模板等。这些约定帮助Ember.js框架更好...
灵活性上,BackboneJS的约定最少,允许开发者自由定制,而AngularJS和EmberJS提供更完整的解决方案,可能限制了某些程度的自由度。学习曲线方面,AngularJS由于其丰富的特性,上手可能稍快,但深入理解需要时间;...
下面将详细介绍emberjs的模板渲染及其相关概念。 1. **Router中的renderTemplate方法** `renderTemplate`方法是路由(Route)中的关键函数,它负责在路由切换时渲染对应的模板(Template)。例如,通过`this....
它提供了一套完整的结构和约定,帮助开发者构建可维护、可扩展的前端项目。作为jQuery的有力竞争者,Ember.js旨在通过提供一套全面的工具和模式来简化Web开发流程。 在JavaScript的世界里,MVC架构是一种流行的设计...
EmberJS 强调约定优于配置,这意味着开发者在开始项目时可以遵循一套明确的规范,而无需过多的初始化设置。框架的核心特性包括路由器、数据管理(通过 Ember Data)、以及组件系统,这些都为构建复杂应用提供了基础...
emberJS脚手架 市面上vue和react的样例代码都比较多,ember资源反而比较少。 进入此代码目录 直接使用命令 "ember s" 即可进入开发状态。 编译生产代码命令 "ember b --env production
在vs2012,vs2010下使用 Emberjs 分层结构
website, emberjs.com 源 网站 Ember.js 项目的网站。要开始:git clone https://github.com/emberjs/website.gitcd websitebundlebundle exec midd
EmberJS 是一个开源的 JavaScript 框架,主要用于构建单页应用程序(SPA)。它遵循 Model-View-Controller(MVC)设计模式,提供了一套完整的框架,帮助开发者组织代码,提高开发效率,并且有着良好的社区支持和丰富...
ember-js-docker EmberJs的Docker映像支持的标签和相应的Dockerfile链接如何使用这张图片该映像安装了EmberJs和Chrome,从而有助于测试,运行和构建EmberJs应用程序。在您的项目中创建一个Dockerfile将以下...
因此,"用于辅助Emberjs开发的ChromeDevTools插件"应运而生。 这款插件专门针对Ember.js进行了优化,它能够帮助开发者更好地理解和调试Ember对象。以下是一些关键功能和知识点: 1. **Ember对象的格式化**:该插件...
EmberJS 是一个开源的JavaScript框架,用于构建可维护性和用户体验优秀的Web应用程序。它遵循了MVC(模型-视图-控制器)模式,并且强调数据绑定、依赖注入和双向数据流,使得开发者能够更高效地构建大型复杂应用。在...
Empress, 使用EmberJS和GitHub的简单博客 Empress是一个利用 EmberJS插件和GitHub的引导博客模板。 Empress让你在 Markdown 创作你的博客文章,并使用 git ( 还有一些 ruby hackery ) 即时生成你的博客。 Empress...
Ember强调约定优于配置,有着严格的文件结构和命名规则。它有强大的数据绑定和路由系统,使得状态管理变得简单。Ember CLI是其命令行工具,提供了自动化构建、测试和开发环境的设置。 Angular,最初由Google开发,...
emberjs 的另一个承诺感知组件的实现 像这样使用它: {{ #promise-button promise = myPromise loadingText = " loading " }} submit will to allah {{ /promise-button }} 这将创建一个按钮,当 myPromise 挂...
jar包,官方版本,自测可用