英文原文:http://emberjs.com/guides/understanding-ember/debugging/

调试Ember和Ember Data

下面是一些调试Ember应用的小技巧。

另外,检出ember-extension项目,ember-extension是一个Chrome开发工具,可以用来查看应用中的Ember对象。

路由

在日志中输出路由转换信息

  1. window.App = Ember.Application.create({
  2. // 基础日志,例如:'Transitioned into 'post'"
  3. LOG_TRANSITIONS: true,
  4. // 更为详尽的日志,记录切换到一个路由时所有的内部步骤,包括:
  5. // `beforeModel`,`model`和`afterModel`钩子,以及跳转和取消的切换的信息
  6. LOG_TRANSITIONS_INTERNAL: true
  7. });

查看所有注册的路由

  1. Ember.keys(App.Router.router.recognizer.names)

获取当前路由名/路径

Ember在ApplicationController中以currentRouteNamecurrentPath属性来记录当前路由和路径。currentRouteName的值(例如:”comments.edit”)可以用来作为transitionTo{{linkTo}}Handlebars助手的目标参数,currentPath完整表述了路由进入的整个路径(如:"admin.posts.show.comments.edit")。

视图/模板

在日志中输出视图查询

  1. window.App = Ember.Application.create({
  2. LOG_VIEW_LOOKUPS: true
  3. });

通过DOM元素ID获取视图对象

  1. Ember.View.views['ember605']

查看所有注册模板

  1. Ember.keys(Ember.TEMPLATES)

Handlebars调试助手

  1. {{debugger}}
  2. {{log record}}

控制器

在日志中记录自动生成的控制器

  1. window.App = Ember.Application.create({
  2. LOG_ACTIVE_GENERATION: true
  3. });

Ember Data

查看ember-data的标示符映射

  1. // all records in memory
  2. App.__container__.lookup('store:main').recordCache
  3. // attributes
  4. App.__container__.lookup('store:main').recordCache[2].get('data.attributes')
  5. // loaded associations
  6. App.__container__.lookup('store:main').recordCache[2].get('comments')

观察器/绑定

查看一个对象、键值的所有观察器

  1. Ember.observersFor(comments, keyName);

在日志中记录对象绑定

  1. Ember.LOG_BINDINGS = true

其他

查看容器中的实例

  1. App.__container__.lookup("controller:posts")
  2. App.__container__.lookup("route:application")

处理废弃信息

  1. Ember.ENV.RAISE_ON_DEPRECATION = true
  2. Ember.LOG_STACKTRACE_ON_DEPRECATION = true

实现一个Ember.onerror钩子来记录生产环境下的所有错误

  1. Ember.onerror = function(error) {
  2. Em.$.ajax('/error-notification', {
  3. type: 'POST',
  4. data: {
  5. stack: error.stack,
  6. otherInformation: 'exception message'
  7. }
  8. });
  9. }

引入控制台

如果使用imports,需要引入控制台:

  1. Ember = {
  2. imports: {
  3. Handlebars: Handlebars,
  4. jQuery: $,
  5. console: window.console
  6. }
  7. };

RSVP.Promise中的错误

有时候,在处理承诺时,错误信息并没有被正确的抛出,就好像被吞下了一样。这使得跟踪问题出在什么地方变得十分困难。不过要感谢RSVP,它内置了一种专用于处理这种情况的方法。

只需要提供一个onerror函数,供在承诺发生错误的时候被调用,来查看错误的详细信息。这个函数根据需要来设计,不过通常的方法是在其中调用console.assert在控制台里面输出错误信息。

  1. Ember.RSVP.configure('onerror', function(error) {
  2. Ember.Logger.assert(false, error);
  3. });

Ember.run.later(Backburner.js)中的错误

Backburner支持将堆栈记录汇合在一起,以便跟踪Ember.run.later中的错误实在什么地方发生的。不幸的是,这非常的缓慢,并不适用与生产环境,甚至是开发环境。

启用该模式需要设置:

  1. Ember.run.backburner.DEBUG = true;