我的页面上有一个小框,用户可以拖动文件并删除它们。当某些东西被拖入阴影时它会变成阴影,阴影在掉落时会变色。经过一段时间后,阴影就消失了。
这就是我认为视图中的事件代码应如下所示:
App.AddView = Ember.View.extend({
classNameBindings: ['enter:enter:leave', 'dropped:dropped:leave'],
enter: false,
dropped: false,
text: 'Drag image files here.',
drop: function(event) {
this.set('text', 'Thanks!');
this.set('enter', false);
this.set('dropped', true);
setTimeout(function() {
this.set('text', 'Drag image files here.');
this.set('dropped', false);
}, 3500);
event.preventDefault();
event.stopPropagation();
},
[...]
但是,我遇到了一些问题:
this.set('text', [sometext])
似乎没有做任何事情,无论是在超时功能内还是在其外部。但是,$('#drop).text([sometext])
在超时功能内部和外部都起作用。我不明白为什么会这样。this.set('dropped', false)
(在超时函数内)似乎没有从元素中删除“已删除”类,即使this.set('dropped', true)
(在超时函数之外)确实有效。再说一次,我不明白这里发生了什么。使用计时器更改文本并在视图上添加/删除类的正确Ember.js方法是什么?
答案 0 :(得分:3)
this
在setTimeOut函数中使用它时,是错误的,因为它绑定到了不正确的对象。要解决这个问题,你可以说
setTimeout(function () { blah }.bind(this), interval)
或通过分配
以通常的方式做到这一点var self = this;
setTimeOut(function() { //use self here }, interval )
但是,在ember世界中使用setTimeOut是不受欢迎的。
是一个更好的解决方案Ember.run.later
由ember提供,基本上模仿setTimeOut。