ルートにsetupController
andmodel
フックがあります。model.find(param) は、Rails バックエンドへの ajax 呼び出しを保持します。
何が起こるかというと、モデル フックが起動し、バックエンドが呼び出されます。しかし、バックエンドが応答し、成功のコールバックが実際にモデルとともに返される前に、setupController
まだ定義されていないモデルでフックが起動します。
最終結果は、モデル自体がバインディング システムを介して更新されている間、setupController で行う必要がある追加のセットアップが機能していないということです。どうもモデルの内容を間違っているような気がするのですが、よくわかりません。
ちなみに、これは、戻るボタンと進むボタンを使用してナビゲートした場合にのみ発生します。#linkTo
指定されたオブジェクトを使用してルートを進むと、すべてが期待どおりに機能します。
誰かが素晴らしいアイデアを持っている場合、私が持っているコードは以下のとおりです。
App.ProjectsEditRoute = Ember.Route.extend({
model: function(params) {
return App.Project.find(params.project_id);
},
setupController: function(controller, model) {
this.controllerFor('activedataset.index').set('content', App.ActiveDataSet.findAll(model.id));
}
});
App.Project = Ember.Object.extend({
id: '',
name: ''
});
App.Project.reopenClass({
findAll: function() {
var result = Ember.ArrayProxy.create({content: []});
var self = this;
$.ajax({
url: '/projects.json',
type: 'GET',
data: {'user_id': App.currentUser.id},
success: function(data, textStatus, xhr) {
result.set('content', data.projects);
},
error: function(xhr, textStatus, errorThrown) {
alert('error');
}
});
return result;
},
find: function(project_id) {
var result = Ember.Object.create({content: null});
var self = this;
$.ajax({
url: '/projects/' + project_id + '.json',
type: 'GET',
success: function(data, textStatus, xhr) {
result.setProperties(data.project);
},
error: function(xhr, textStatus, errorThrown) {
alert('not found');
}
});
return result;
}
});
Mike が提供するソリューションの後に編集します。
App.ProjectsEditRoute = Ember.Route.extend({
model: function(params) {
var record = App.Project.find(params.project_id);
var promise = Ember.Deferred.create();
record.addObserver('isLoaded', function() {
promise.resolve(record);
});
return promise;
},
setupController: function(controller, model) {
this.controllerFor('activedataset.index').set('content', App.ActiveDataSet.findAll(model.id));
}
});
App.Project.reopenClass({
find: function(project_id) {
var result = Ember.Object.create({content: null, isLoaded: false});
var self = this;
$.ajax({
url: '/projects/' + project_id + '.json',
type: 'GET',
success: function(data, textStatus, xhr) {
result.setProperties(data.project);
result.set('isLoaded', true);
},
error: function(xhr, textStatus, errorThrown) {
alert('not found');
}
});
return result;
}
});