Ember JS 和 jquery-ui 回调范围

Posted

技术标签:

【中文标题】Ember JS 和 jquery-ui 回调范围【英文标题】:Ember JS and jquery-ui scope of callbacks 【发布时间】:2013-11-30 15:01:00 【问题描述】:

我正在使用最新的 ember js 并且有以下视图:

App.PeriodSelectorView = Em.View.extend
  classNames: "period-selector"
  templateName: "period_selector"

  didInsertElement: ->
    @$().draggable()
    @setupTimeSlider()

  setupTimeSlider: ->
    @$(".time-slider").slider
      value: 20
      min: 20 # 0500 in the morning
      max: 83 # 2045 in the evening
      step: 1
      slide: @updateTimeValue

  updateTimeValue: (event, ui) ->
    @set("time", ui.value)

现在,当滑块更改时,回调会触发,但 this 设置为 window 而不是视图实例。所以调用this.set 失败。

我已经尝试使用 coffeescript 的胖箭头 (=>) 运算符将方法 updateTimeValue 绑定到实例,但它不起作用。

如何让this 指向视图实例而不是window

【问题讨论】:

您能否详细说明您如何尝试使用=>?这个答案似乎暗示它应该工作:***.com/questions/8965855/… 我只是使用 => insteaf of -> 作为 updateTimeValue。但是我只是从编译的代码中看到,实际上这并没有做任何事情。原因似乎是我不使用“class App.PeriodSelectorView extends Em.View”。但是我不能使用这种形式,因为这样就没有任何效果,只会抛出一堆异常......我必须深入研究一下。 【参考方案1】:

问题

我不是咖啡脚本专家,但在我的测试中,似乎使用了 => 运算符。在父函数范围内生成_this = this。例如:

使用:

App = Ember.Application.create()

App.PeriodSelectorView = Em.View.extend  
  ...
  updateTimeValue: (event, ui) =>
    @set("time", ui.value)

生成以下内容:

var App,
  _this = this;

App = Ember.Application.create();

App.PeriodSelectorView = Em.View.extend(
  ...
  updateTimeValue: function(event, ui) 
    // _this here is window object, this isn't what you want
    return _this.set("time", ui.value);
  
);

解决方案 1

按照这个逻辑使用匿名函数,你会得到预期的结果:

更新如下:

App = Ember.Application.create()

App.PeriodSelectorView = Em.View.extend
  ...
  setupTimeSlider: ->
    @$(".time-slider").slider
      value: 20
      min: 20 # 0500 in the morning
      max: 83 # 2045 in the evening
      step: 1
      slide: (event, ui) => #slide now is an anonymous function 
        @set("time", ui.value)

生成:

var App;

App = Ember.Application.create();

App.PeriodSelectorView = Em.View.extend(
  ...
  setupTimeSlider: function() 
    // now _this is the view context
    var _this = this;

    return this.$(".time-slider").slider(
      value: 20,
      min: 20,
      max: 83,
      step: 1,
      slide: function(event, ui) 
        // this will work
        return _this.set("time", ui.value);
      
    );
  
);

解决方案 2

如果你想把函数名和函数声明放在同一个地方。你可以使用jQuery.proxy:

App = Ember.Application.create

App.PeriodSelectorView = Em.View.extend
  ...
  setupTimeSlider: ->
    @$(".time-slider").slider
      value: 20
      min: 20 # 0500 in the morning
      max: 83 # 2045 in the evening
      step: 1
      slide: Ember.$.proxy @updateTimeValue, @

  updateTimeValue: (event, ui) ->
    @set("time", ui.value) 

希望对你有帮助

【讨论】:

谢谢马尔西奥!我不能再尝试你的方法了,因为我完全改变了我的实现,它现在基于github.com/lukemelia/jquery-ui-ember,但我相信我将来会需要这些概念。 没问题。很高兴为您提供帮助!

以上是关于Ember JS 和 jquery-ui 回调范围的主要内容,如果未能解决你的问题,请参考以下文章

ember.js的环境(window)安装及创建应用

jquery-ui datepicker 设置开始结束时间选择范围

范围内的角度 jquery-ui 可选问题

fullpage.js用法总结

Ember.js 和 RequireJS

toastr 和 ember.js