我有一个 mixin,它会在页面调整大小时自动重新计算并设置 div 的高度。
它可以工作,但在我看来,绑定到 jQuery 事件并在每次调用时手动触发 Ember 事件似乎很愚蠢。
有没有办法直接在 Ember 中绑定到窗口事件?
我有一个简化的 JSFiddlehere http://jsfiddle.net/kGhrx/1/
这是代码:
App.windowWrapper = Ember.Object.create(Ember.Evented,
resizeTimer: null
init: ->
@_super()
object = this
$(window).on 'resize', ->
window.clearTimeout(object.resizeTimer)
object.resizeTimer = setTimeout( App.windowWrapper.resize, 100)
true
resize: ->
App.windowWrapper.fire('resize')
)
以及调用它的 mixin。
App.Scrollable = Ember.Mixin.create
classNames: "scrollable"
init: ->
Ember.assert("Scrollable must be mixed in to a View", this instanceof Ember.View)
@_super()
didInsertElement: ->
@_super()
@calculateHeight()
App.windowWrapper.on('resize', this, 'calculateHeight')
willDestroyElement: ->
App.windowWrapper.off('resize', this, 'calculateHeight')
@_super()
calculateHeight: ->
offset = @$().offset().top
windowHeight = $(window).height()
@$().css('height', windowHeight - offset)
我知道我晚了几年,但我一直在寻找同一问题的解决方案并发现了这一点:
jQuery(window).on('resize', Ember.run.bind(this, this.handleResize));
(来源:Ember.js 官方 http://emberjs.com/blog/2014/02/12/ember-1-4-0-and-ember-1-5-0-beta-released.html)
**** 附注
关于这个小技巧的实现 - 我不知道是否可以在控制器方法中使用它并在 init 上触发(如 denis.peplin 评论的那样),我实际上是在路由的“setupController”函数中绑定事件。我不知道这是否是最佳实践,但它在我的应用程序中就像一个魅力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)