我是一个Ember新手,所以如果我错过了某些明显的东西(我花了时间Google搜索这个问题,仍然找不到解决方案),请原谅我,但在我看来,Ember计算出来的属性不像按照数组属性(如长度)记录/打算那样工作。Ember在阵列上计算的属性
我试图建立自己的队列:
// app/custom-objects/processing-queue-item.js
import Ember from 'ember';
export default Ember.Object.extend({
payload: null,
extraContext: null,
processingState: 'pending', // pending, succeeded, failed
processingOutcome: null, // null for pending, result for succeeded, error for failed
toString() {
return `{ProcessingQueueItem: processingState=${this.get('processingState')}, processingOutcome=${this.get('processingOutcome')}, extraContext=${this.get('extraContext')}, payload=${this.get('payload')}}`;
}
});
// app/custom-objects/processing-queue.js
import Ember from 'ember';
import ProcessingQueueItem from './processing-queue-item';
export default Ember.Object.extend(Ember.Enumerable, {
queueName: null,
init() {
this.set('items', []);
this.get('items');
this.get('items.length');
this.get('length'); // Force observation
},
/*
* Public API
*/
enqueue(payload, extraContext = null) {
let itemToEnqueue = ProcessingQueueItem.create({ payload: payload, extraContext: extraContext });
this.get('items').pushObject(itemToEnqueue);
this.scheduleProcessing();
return itemToEnqueue;
},
toString() {
return `{ProcessingQueue: queueName=${this.get('queueName')}, length=${this.get('length')}}`;
},
/*
* Internal API
*/
scheduleProcessing() {
Ember.run(() => {
this.maybeProcessAnItem();
});
},
maybeProcessAnItem() {
console.log(`maybe process an item ${this}`);
},
/*
* Ember.Enumerable mixin
*/
length: Ember.computed('items.length', function() {
return this.get('items.length');
}),
nextObject(index, previousObject, context) {
return this.get('items').nextObject(index, previousObject, context);
}
});
这个类是不完整的,但我想开始在模板显示队列内容,以帮助调试,但我不能得到那个工作。这里是我的控制器和模板:
// app/controllers/dashboard.js
import Ember from 'ember';
import ProcessingQueue from '../custom-objects/processing-queue';
export default Ember.Controller.extend({
init() {
this._super(...arguments);
this.set('processingQueue', ProcessingQueue.create({ queueName: 'DashboardQueue' }));
this.get('processingQueue');
this.get('processingQueue.length');
this.get('queueLength');
},
queueLength: Ember.computed('processingQueue.length', function() {
return this.get('processingQueue.length');
}),
});
// app/templates/dashboard.hbs
<h1>Dashboard</h1>
<h2>Queue Length: '{{queueLength}}'</h2>
{{#each processingQueue as |queueItem|}}
<p>{{queueItem.payload}}</p>
{{/each}}
{{outlet}}
的问题是,在<h2>Queue Length: '{{queueLength}}'</h2>
,队列长度总是不确定的,直到我将项目添加到队列中。但事实并非如此,队列中有一个空阵列并且长度为0.从EmberInspector的仪表板控制器中使用$E
,我可以看到$E.get('processingQueue.length')
和$E.get('queueLength')
都是undefined
。
奇怪的是,只要我将项目添加到队列中,队列长度就会变得定义,1, 2, 3, ...
并保持同步,并在添加队列项目时同步模板。因此,第一个$E.get('processingQueue').enqueue('foo')
会自动更新模板以显示队列长度为'0',然后'1'等等。
为什么它在我入选任何物品之前未定义?我试图根据Unconsumed Computed Properties Do No Trigger Observers添加获得所有的地方,但这似乎没有帮助。
任何想法?我完全有可能误解这里的计算属性,但我不明白是什么,为什么...我试过volatile(), [], @each
以及所有那些,我也无法让它们有所作为。东西是不对的...
任何帮助将非常感激,我会愿意添加到维基,写一篇博客文章,也许释放我的队列作为开放源代码作为谢谢。 :-)
谢谢!并再次感谢使Ember如此真棒!
是否有一些代码在您的代码示例的最顶部失踪? – 2016-11-27 02:58:04
我不这么认为......你是什么意思“缺少代码”?我在S.O.遇到了一些麻烦。代码格式化(为什么它不支持围栅代码块?)但我没有故意忽略任何东西......我很好奇你的意思?谢谢! – Joel
这是EmberTwiddle,如果有帮助:https://ember-twiddle.com/2892b20ceb81e8655b628d2b6fabbb1d?打开文件控制器.application.js%2C – Joel