2014-03-17 3 views
0

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

ответ

0

Понял, после небольшой помощи Стефана Пеннера в часы хакера.

Вы не можете использовать sortProperties на модели, потому что он предоставляется Ember.SortableMixin, который смешивается только с контроллерами.

Я не думаю, что это было на самом деле сортировка. Ха!

Смежные вопросы