我有一个定义onDragEvent的控制器:
controller = Em.Object.create( {
onDragEvent: function() {
console.log("Drag Event");
}
});
我有一个混合:
Event = Ember.Mixin.create( {
attributeBindings: 'draggable',
draggable: 'true',
drag: function (event) {
Em.run.throttle(this, controller.onDragEvent, 1000);
}
});
我的理解是,在拖动过程中,控制器.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.create
vs。 Ember.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();
即可。
我刚刚意识到我从未看到堆栈的右侧。 您使用的是旧版本的 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);
}
});
我所知,您希望在拖动元素时每隔一段时间触发一个事件,并且该事件在控制器中提示函数调用。
您可以使用 throttle
来阻止调用函数的频率超过指定的超时期限。这里有一些文档:http://emberjs.com/api/classes/Ember.run.html#method_throttle。如果您在调用函数之前声明函数,而不是匿名传递它,您的问题是否仍然存在?
您的控制器可能应该从 Ember.ObjectController
扩展,而不是Ember.Object
,因为ObjectController
附带了许多方便的方法,这些方法将使将控制器作为控制器而不是通用对象访问要容易得多。