【问题标题】:(Ember.run.throttle) Object Function has no method 'throttle' in Ember.Mixin(Ember.run.throttle) 对象函数在 Ember.Mixin 中没有方法 'throttle'
【发布时间】:2013-10-18 18:54:08
【问题描述】:

我有一个定义 onDragEvent 的控制器:

controller = Em.Object.create( {
    onDragEvent: function() {
        console.log("Drag Event");
    }
});

我有一个 Mixin:

Event = Ember.Mixin.create( {
    attributeBindings: 'draggable',
    draggable: 'true',
    drag: function (event) {
        Em.run.throttle(this, controller.onDragEvent, 1000);
    }
});

我的理解是,在拖动过程中,controller.onDragEvent 应该每 1000 毫秒调用一次。

控制台正在注销:

Uncaught TypeError: Object function (a,b){var d,e;f.begin();try{if(a||b)d=c(a,b,arguments,2)}finally{f.end()}return d} has no method 'throttle' Events.js:42
Events.Ember.Mixin.create.drag Events.js:42
Ember.View.Ember.Object.extend.trigger ember-1.0.pre.min.js:16
d ember-1.0.pre.min.js:14
Ember.View.states.hasElement.handleEvent ember-1.0.pre.min.js:16
Ember.View.Ember.Object.extend.invokeForState ember-1.0.pre.min.js:16
Ember.View.Ember.Object.extend.handleEvent ember-1.0.pre.min.js:16
(anonymous function) ember-1.0.pre.min.js:16
c ember-1.0.pre.min.js:14
Ember.run ember-1.0.pre.min.js:14
Ember.EventDispatcher.Ember.Object.extend._bubbleEvent ember-1.0.pre.min.js:16
(anonymous function) ember-1.0.pre.min.js:16
f.event.dispatch jquery-1.7.2.min.js:3
h.handle.i

我很确定我不明白如何使用油门功能。我还注意到我使用的是Em.Object.createEmber.Mixin.create,但是在没有油门的情况下调用controller.onDragEvent 可以正常工作。我做错了什么?

编辑 1:

如果我使用:

Event = Ember.Mixin.create( {
    attributeBindings: 'draggable',
    draggable: 'true',
    drag: function (event) {
        Em.run.throttle(controller, onDragEvent, 1000);
    }
});

我得到一个不同的错误:

Uncaught ReferenceError: onDragEvent is not defined

供参考;只需调用 controller.onDragEvent(); 即可。

【问题讨论】:

  • 是的,onDragEvent 没有指向任何东西,controller.onDragEvent 是正确的。

标签: javascript html ember.js


【解决方案1】:

我刚刚意识到我从未见过堆栈的右侧。您使用的是旧版本的 ember,油门和去抖动功能直到 1.0 beta 后期才引入(准确地说是 1.0 RC7,这是 1.0 pre 之后的方式)

切换到这个版本:

//cdnjs.cloudflare.com/ajax/libs/ember.js/1.0.0/ember.js

它似乎对我有用:

http://emberjs.jsbin.com/oZIMiMA/1/edit

在输出中突出显示 a 或 b。

你能设置一个 jsbin 显示它不工作吗?

可拖动示例:

http://jsfiddle.net/tjZac/1/

DragNDrop.Draggable = Ember.Mixin.create({
  attributeBindings: 'draggable',
  draggable: 'true',
    drag: function(event) {
        console.log('real call')
         Ember.run.throttle(this, DragNDrop.controller.onDragEvent, 300);
    }
});

【讨论】:

  • 控制器是否存在于上下文中?
  • 看它是全局的,所以它应该存在。你将你的 mixin 附加到什么上?
  • 如何查看?如果我只是打电话给controller.onDragEvent(); 它会正常触发
  • 这展示了这种行为,但我正在使用的东西要复杂得多。例如,我不确定控制器和 mixin 是如何“连接”的,但它们是。这个..jsfiddle.net/jujodi/tjZac.只需拖动前两个框之一即可查看错误(我编辑了一个随机小提琴)
  • 这是一个非常旧的 Ember 版本,让我更新并回复您。
【解决方案2】:

据我所知,您希望在拖动元素时经常触发一个事件,并希望该事件在控制器内提示函数调用。

您可以使用throttle阻止函数被调用的频率超过指定的超时时间。这里有一些文档:http://emberjs.com/api/classes/Ember.run.html#method_throttle。如果您在调用之前声明函数而不是匿名传递,您的问题是否仍然存在?

您的控制器可能应该从Ember.ObjectController 扩展,而不是Ember.Object,因为ObjectController 带有许多方便的方法,可以将控制器作为控制器而不是通用对象进行访问更容易。

【讨论】:

  • 您对节流阀的解释很有道理,那么我该如何使用它来实现每 1000 毫秒调用一次 onDragEvent 呢?
  • 声明函数而不是将匿名函数传递给Em.run.throttle会有帮助吗?
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2016-02-11
  • 2017-12-16
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多