Ember 1.4.0和1.5 Beta发布


1.4中的新特性

属性大括号扩展

在之前的Ember版本中,如果需要观察bazfoobar属性,需要在同时设置baz.foobaz.bar两个依赖键。

1
2
3
4
5
6
7
var obj = Ember.Object.extend({
  baz: {foo: 'BLAMMO', bar: 'BLAZORZ'},

  something: function(){
    return this.get('baz.foo') + ' ' + this.get('baz.bar');
  }.property('baz.foo', 'baz.bar')
});

使用最新的属性大括号扩展,可以这样来简化依赖设置:

1
2
3
  something: function(){
    return this.get('baz.foo') + ' ' + this.get('baz.bar');
  }.property('baz.{foo,bar}')

这样大大的简化了重复和冗余的相似依赖键的设置。

详细的内容可以查看PR #3538

Ember.run.bind

Ember.run.bind是一个非常有用的工具,可以用来集成提供异步回调的非Ember库。

Ember使用运行循环来批处理和合并更新。这是通过标记Ember相关代码的开始和结束执行来实现的。

当使用事件时,如视图点击处理器,Ember把该处理器包裹在一个运行循环中。如果与非Ember库集成,那么就会变得非常让人厌烦。

例如,下面的代码就非常的啰嗦,不过确实正确的处理第三方库事件的Ember代码:

1
2
3
4
5
6
var that = this;
jQuery(window).on('resize', function(){
  Ember.run(function(){
    that.handleResize();
  });
});

为了减少这种套式代码,下面的代码可以完成将回调包裹到一个运行循环中。

1
jQuery(window).on('resize', Ember.run.bind(this, this.handleResize));

更多的关于运行循环的内容,请查看运行循环指南。(非常感谢Brendan Briggs)。

支持控制器的{{with}}

{{with}}助手现在可以接收一个controller选项。添加controller='something'表示{{with}}助手将创建和使用一个指定的控制器来作为其内容的新上下文。

这与{{each}}助手中使用itemController选项非常类似。

1
2
3
{{#with users.posts controller='userBlogPosts'}}
  {{!- The current context is wrapped in our controller instance }}
{{/with}}

在上例中,提供给{{with}}块的模板被包裹到userBlogPost控制器中,这提供了一个非常简单的方法,来讲当前上下文中添加自定义的函数和属性。

延迟绑定属性

之前,所有绑定的属性都有一定程度的开销(大部分是维护绑定和观察器之间的关联关系)。这导致需要限制自动绑定到Ember.TextFieldEmber.TextArea等控件上的属性。对于越来越多的人希望绑定HTML5属性来说,这是一个问题的根源。为了多绑定属性,不得不重新打开Ember.TextField类,然后添加可以绑定的属性。

例如:

1
2
3
Ember.TextField.reopen({
  attributeBindings: ['autofocus']
});

然后在模板中就可以:

1
{{input autofocus=omgAutofocusMe}}

这当然不理想,对于那些认为Ember.TextField理所当然支持的人来说,会遇到非常多问题。

随着Ember 1.4的发布,这个问题得到了很好的处理。在1.4中,任何属性绑定在试图被渲染的时候如果不存在,那么不会为他设置观察器(因此避免了原本的性能开销问题)。当试图在之后又设置了该属性的时候(在初次渲染之后),一个属性观察器会在这时被添加。

这意味着只会为存在的谁能够添加观察器,这样就可以在attributeBindings中添加所有有效的HTML属性,今后就可以直接使用,而不需要在重新打开类来添加。

在Ember 1.4中{{input type="text"}}{{textarea}}{{checkbox}}助手可以使用任何HTML5的属性。

其他改进

一如既往,本次发布还修改了许多之前版本存在的Bugs,对一部分功能也作出了一些改进。详细的内容可以查看CHANGELOG:


博客评论基于Disqus