1

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.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();動作します。

4

2 に答える 2

1

スタックの右側を見たことがないことに気付きました。古いバージョンの ember を使用しています。スロットルとデバウンスの機能は、1.0 ベータの後半まで導入されませんでした (正確には 1.0 RC7、これは 1.0 プレよりもずっと後です)。

このバージョンに切り替えます:

//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);
    }
});
于 2013-10-18T19:32:52.807 に答える
0

私が知る限り、要素をドラッグしているときにイベントを頻繁に発生させ、そのイベントでコントローラー内の関数呼び出しを促すことができます。

を使用して、指定されたタイムアウト期間よりも頻繁に関数が呼び出されるのthrottleを防ぐことができます。ここにいくつかのドキュメントがあります: http://emberjs.com/api/classes/Ember.run.html#method_throttle。関数を匿名で渡すのではなく、呼び出される前に関数を宣言すると、問題は解決しませんか?

には、汎用オブジェクトではなくコントローラーとしてコントローラーにアクセスするための便利なメソッドが多数付属しているため、コントローラーはおそらくEmber.ObjectControllerではなくから拡張する必要があります。Ember.ObjectObjectController

于 2013-10-18T19:29:01.513 に答える