这可能取决于进度任务完成的速度。我目前正在ProgressView
使用具有progress
更新属性的相应模型来执行此操作。
当模型更改时,进度条会随着视图绑定到此模型而更新。这就是我的做法。模型中的实际值使用来自其他部分的事件进行更新,这里使用了 setInterval。
编辑:用 jsbin 更新问题后
这些this.set('progress')
调用被折叠成一个调用,其中最后一个值由 Ember 运行循环设置。这是一项重要的性能优化,有助于防止绑定在每个运行循环中只为给定属性触发一次。
要强制将progress
呼叫排队,您需要将其包装在某种间隔中,或使用Ember.run.scheduleOnce
. 即:- 立即增加步数计数器,然后以间隔或scheduleOnce
.
这是一个例子ProgressStepper
。您指定totalSteps
at 实例化时间,并next
在步骤完成时调用。进度条可以绑定到它的progress
属性。它使用scheduleOnce
,您可以使用 100 毫秒的 setInterval 来减慢速度。
App.ProgressStepper = Em.Object.extend({
totalSteps: 10,
currentStep: 0,
progress: 0,
complete: Ember.K(),
pending: 0,
isOnRunloop: false,
next: function() {
this.set('pending', this.get('pending') + 1);
if (!this.get('isOnRunLoop')) {
this.set('isOnRunLoop', true);
this.enqueue();
}
},
enqueue: function() {
// ticking on the runloop gives better performance
// as it doesn't use additional timers
Ember.run.scheduleOnce('afterRender', this, 'onNext');
// use this is if you want to tick slower
//setTimeout(this.onNext.bind(this), 100);
},
onNext: function() {
this.nextStep();
if (this.hasPending()) {
this.enqueue();
} else {
this.set('isOnRunLoop', false);
}
},
hasPending: function() {
return this.get('pending') > 0;
},
nextStep: function() {
this.set('pending', this.get('pending') - 1);
var currentStep = this.get('currentStep');
var totalSteps = this.get('totalSteps');
currentStep++;
if (currentStep <= totalSteps) {
this.set('currentStep', currentStep);
this.updateProgress();
if (currentStep == totalSteps) {
Ember.run.scheduleOnce('afterRender', this, 'complete');
}
}
},
updateProgress: function() {
var progress = this.get('currentStep') / this.get('totalSteps') * 100;
this.set('progress', progress);
}
});
这是一个更新的jsbin。