簡體   English   中英

為什么此Ember.computed屬性的觀察者會觸發兩次?

[英]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只能為null30 當它為null ,我期望isQueuedfalse並跟蹤被過濾掉。 當它為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM