[英]Why does this Ember.computed property's observer fire twice?
我有一個錯誤,其中計算出的屬性會立即更改為錯誤的值。
JSBin復制錯誤: http ://jsbin.com/yufet/6/edit?js,console
// ember.js 1.6.0-beta.1+canary.8d91bf06
// ember-data 1.0.0-beta.7+canary.02d7c7be
App.Playlist = DS.Model.extend({
tracks: DS.hasMany('track', { inverse: 'playlist' }),
sortProperties: ['trackOrder:asc'],
sortedTracks: Ember.computed.sort('tracks', 'sortProperties'),
queuedTracks: Ember.computed.filterBy('sortedTracks', 'isQueued'),
currentTrack: Ember.computed.alias('queuedTracks.firstObject')
});
App.Track = DS.Model.extend({
playlist: DS.belongsTo('playlist', { inverse: 'tracks' }),
title: DS.attr('string'),
trackOrder: DS.attr('number'),
isOrdered: Ember.computed.notEmpty('trackOrder'),
playedAt: DS.attr('date'),
hasPlayed: Ember.computed.notEmpty('playedAt'),
hasNotPlayed: Ember.computed.not('hasPlayed'),
isQueued: Ember.computed.and('isOrdered', 'hasNotPlayed')
});
然后我的主要:
store = App.__container__.lookup('store:main');
store.pushPayload('playlist', {
"playlist": {
"id":1,
"title":"Playlist 1",
"track_ids":[1,2,3,4,5]
},"tracks":[
{ "id":1, "playlist_id":1, "title": "Track 0", "track_order": 5, "played_at":null },
{ "id":2, "playlist_id":1, "title": "Track 1", "track_order": 10, "played_at":null },
{ "id":3, "playlist_id":1, "title": "Track 2", "track_order": 15, "played_at":null },
{ "id":4, "playlist_id":1, "title": "Track 3", "track_order": 20, "played_at":null },
{ "id":5, "playlist_id":1, "title": "Track 4", "track_order": 25, "played_at":null }
]
});
store.find('playlist', 1).then(function(pl) {
playlist = pl;
var observer = Ember.Object.create({
logMessage: function(room) {
console.log('currentTrack changed to', playlist.get('currentTrack.title'));
}
});
playlist.addObserver('currentTrack', observer, 'logMessage');
playlist.get('currentTrack.title');
track = playlist.get('tracks').createRecord({ title: 'A new song!!'});
track.set('trackOrder', 30);
});
輸出:
currentTrack changed to A new song!!
currentTrack changed to Track 0
track.trackOrder
只能為null
或30
。 當它為null
,我期望isQueued
為false
並跟蹤被過濾掉。 當它為30
,它應該在列表的最后。
如果我未在觀察者本身中調用get('currentTrack.title')
,則currentTrack
仍然是A new song!!
。
在Hacker Hours的Stefan Penner的幫助下,找到了答案。
您不能在模型上使用sortProperties
,因為它是由Ember.SortableMixin
提供的,該Ember.SortableMixin
僅與控制器混合在一起。
我不認為這實際上是在排序。 哈!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.