Ember 将回调传递给服务 - 未定义此
Ember pass callback to service - undefined this
我有一项服务可以分块上传许多大文件
export default Ember.Service.extend({
run(files, callbacks) {
// ugly async FileReader and ajax
// calling callbacks during the process
}
})
我需要一堆回调来显示进度,但问题是 this
在这些回调中未定义
export default Ember.Component.extend({
upload: Ember.inject.service(),
didInsertElement() {
// bind fileinput change event to set up pending files
},
ondonesingle(self, file, uuid) {
// this is undefined
// self is real this
},
actions: {
submit() {
let callbacks = {
ondoneall: this.ondoneall,
ondonesingle: this.ondonesingle,
onprogressall: this.onprogressall,
onprogresssingle: this.onprogresssingle,
onerror: this.onerror,
object: this // will be passed as first argument to each callback
};
this.get('upload').run(this.get('pending_files'), callbacks);
},
}
})
为了解决这个问题,我必须到处引用它。
它有效,但感觉非常错误。在 Ember 中执行此操作的最佳做法是什么? Observable 属性 也感觉不对,我怎么观察2000个文件的进度呢?将所有内容都放在一个大对象中并在整个应用程序中共享?
this
回归的原因 undefined
是当函数被传递时,它的上下文 (this
) 会发生变化。您可以创建一个使用 function.bind
显式设置其上下文的新函数。使用 function.bind
时,无论您在哪里调用新函数或将其分配给什么值/属性,它的上下文都将保持不变。
see MDN for Function.prototype.bind
export default Ember.Component.extend({
upload: Ember.inject.service(),
didInsertElement() {
// bind fileinput change event to set up pending files
},
ondonesingle(file, uuid) {
},
actions: {
submit() {
let callbacks = {
ondoneall: this.ondoneall.bind(this),
ondonesingle: this.ondonesingle.bind(this),
onprogressall: this.onprogressall.bind(this),
onprogresssingle: this.onprogresssingle.bind(this),
onerror: this.onerror.bind(this)
};
this.get('upload').run(this.get('pending_files'), callbacks);
},
}
})
我有一项服务可以分块上传许多大文件
export default Ember.Service.extend({
run(files, callbacks) {
// ugly async FileReader and ajax
// calling callbacks during the process
}
})
我需要一堆回调来显示进度,但问题是 this
在这些回调中未定义
export default Ember.Component.extend({
upload: Ember.inject.service(),
didInsertElement() {
// bind fileinput change event to set up pending files
},
ondonesingle(self, file, uuid) {
// this is undefined
// self is real this
},
actions: {
submit() {
let callbacks = {
ondoneall: this.ondoneall,
ondonesingle: this.ondonesingle,
onprogressall: this.onprogressall,
onprogresssingle: this.onprogresssingle,
onerror: this.onerror,
object: this // will be passed as first argument to each callback
};
this.get('upload').run(this.get('pending_files'), callbacks);
},
}
})
为了解决这个问题,我必须到处引用它。
它有效,但感觉非常错误。在 Ember 中执行此操作的最佳做法是什么? Observable 属性 也感觉不对,我怎么观察2000个文件的进度呢?将所有内容都放在一个大对象中并在整个应用程序中共享?
this
回归的原因 undefined
是当函数被传递时,它的上下文 (this
) 会发生变化。您可以创建一个使用 function.bind
显式设置其上下文的新函数。使用 function.bind
时,无论您在哪里调用新函数或将其分配给什么值/属性,它的上下文都将保持不变。
see MDN for Function.prototype.bind
export default Ember.Component.extend({
upload: Ember.inject.service(),
didInsertElement() {
// bind fileinput change event to set up pending files
},
ondonesingle(file, uuid) {
},
actions: {
submit() {
let callbacks = {
ondoneall: this.ondoneall.bind(this),
ondonesingle: this.ondonesingle.bind(this),
onprogressall: this.onprogressall.bind(this),
onprogresssingle: this.onprogresssingle.bind(this),
onerror: this.onerror.bind(this)
};
this.get('upload').run(this.get('pending_files'), callbacks);
},
}
})