2013-04-29 4 views
0

내 PlaylistController의 메소드에 제출하는 양식이 있습니다. 그 양식 제출에서, 나는 노래 기록을 만들고 그것을 저지른다. 무슨 일이 일어나고 있는지 모든 제출이 잘 작동한다는 것입니다. 새 레코드가 저장되고 커밋됩니다. App.Song.find()를 수행하여 내용이 업데이트되었는지 확인할 수 있습니다.Ember .get ('lastObject') 예상대로 작동하지 않습니다.

하지만 두 번째 제출이 잘못되었습니다. 제출물은 실제로 새로운 레코드로 커밋됩니다. 모델로 이동하면 새로운 값이 저장됩니다. 그러나, find()에 .get ('lastObject')를 사용하려고하면 첫 번째 제출을 얻습니다. 세 번째 제출은 두 번째 등을 반환합니다. 여기

내 코드입니다 :

// create song in Song model first 
    new_song = App.Song.createRecord({ 
    name: 'test name', 
    artist: 'test username', 
    soundcloud: '/tracks/' 
    }); 

    new_song.get('store').commit(); 

    //can't return the song ID when commiting, so need to manually find it 
    // find all songs, return last result 
    last_song = App.Song.find().get('lastObject'); 
    console.log(last_song); 

그리고 여기을 console.log() ('last_song'songs_array.get)입니다;

Object {id: "ember914", clientId: 30, type: function, data: Object, record: Class} 
Object {id: "ember914", clientId: 30, type: function, data: Object, record: Class…} 
Object {id: "ember1200", clientId: 31, type: function, data: Object, record: Class…} 
Object {id: "ember1408", clientId: 32, type: function, data: Object, record: Class…} 

답변

2

새로 생성 된 노래는 생성 후 바로 찾으려고합니다. Ember Run Loop의 나중 단계에서 find() 배열에 추가되기 때문에 작동하지 않습니다.

가장 확실한 해결책은 할 것 :

// create song in Song model first 
new_song = App.Song.createRecord({ 
    name: 'test name', 
    artist: 'test username', 
    soundcloud: '/tracks/' 
}); 

new_song.get('store').commit(); 

Em.run.next(function() { 
    last_song = App.Song.find().get('lastObject'); 
}); 

는 여기를 보여주는 fiddle을합니다.

한 가지주의 할 점은 그러한 문제가 발생했을 때 Ember가 (특히 Run Loop에 대해 걱정하기 시작할 때) 문제를 일으키고 있다고 느낄 때입니다. 이는 아마도 당신이 잘못하고 있다는 것을 의미합니다.

이제 질문을하게 될 것입니다. 왜이 레코드를 만든 직후에이 레코드를 찾으려고합니까?

변수에 레코드를 갖고 싶으면 이미 new_song에 해당 레코드를두고 그 레코드를 나중에 id로 채 웁니다. 일단 last_song을 받으면 last_song === new_song이되므로 무엇을 얻을 수 있었는지 기억하십시오 ...

매우 빠르게 생성되는 ID입니다.),이 작업을 수행 할 수 있습니다

new_song = App.Song.createRecord({ 
    name: 'test name', 
    artist: 'test username', 
    soundcloud: '/tracks/' 
}); 

new_song.one('didCreate', function() { 
    Em.run.next(function() { 
    console.log(new_song.get('id')); 
    }); 
}); 

new_song.get('store').commit(); 

공지 사항 위의 examplet의 Em.run.next은 단지 때문에 곧 해결 될 것입니다 버그의는 있었다.

+0

그래서 내가 바로 레코드를 원한다면 플레이리스트 모델에 저장할 수 있습니다. 필자는 Run 루프와 Ember 데이터와 같은 더 깊은 주제를 시작하기 시작 했으므로 어떻게해야할지 확신이 들지 않았습니다. 오늘 조금 나중에 시도하고 작동 시키면 upvote가되지만이 모든 것이 의미가 있으며 작동해야합니다. 테디 감사합니다! – paulruescher

+0

다른 모델에 ID를 추가 할 필요가 없습니다. 'playlist.get ('songs') .pushObject (new_song)'또는'Song'이 하나의'Playlist' :'new_song.set ('playlist', playlist)'에 속해있을 수 있습니다. 물론 모델 정의에서 관계를 정의해야합니다. –

+0

테디, 사랑해. 그 마지막 코멘트는 계속 작동하고 잔뜩 쓸데없는 코드를 제거합니다. self.get ('content')를 사용하여 끝났다. get ('songs'). pushObject (new_song); (self는 var self = this이고, 내 PlaylistController 내에서. – paulruescher

관련 문제