У меня есть ошибка, когда вычисляемое свойство мгновенно изменяется на неправильное значение.Почему этот наблюдатель Ember.computed собственности дважды срабатывает?
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!!
.