私自身の質問へのフォローアップ。私のコードには 2 つの問題があります。そのうちの 1 つを追跡し、誰かが同様の問題を抱えている場合に備えて、ここで解決策を共有します。
次のようなモデル定義がありました
App.Member.reopenClass({
allMembers: [],
findAll: function(){
$.ajax({
url: 'https://api.company.com/members',
dataType: 'json',
context: this,
success: function(response){
response.data.forEach(function(member){
this.allMembers.addObject(App.Member.create(member))
}, this)
}
})
return this.allMembers;
}
});
はallMembers: []
、すべてのメンバーを保持する参照でした。前後に移動すると、 のメンバーがバックエンドから再ロードされ、 に再度保存されallMembers
ます。
これを解決するには、で定義するだけallMembers
ですfindAll
:
App.Member.reopenClass({
findAll: function(){
var allMembers = [];
$.ajax({
url: 'https://api.company.com/members',
dataType: 'json',
context: allMembers,
success: function(response){
response.data.forEach(function(member){
this.addObject(App.Member.create(member))
}, this)
}
})
return allMembers;
}
});
おそらくルートを組み合わせた方法に関連する 2 つ目の問題があります。解決策がわかり次第、投稿します。
更新、2013-01-22
2 つ目の問題も発見され、emberJS + 戻るボタンが完全に機能するようになりました。繰り返しますが、誰かがつまずいた場合に備えて、問題が何であったかを簡単に要約したいと思います。
ルーティング定義は次のようになります。
App.Router.map(function() {
this.resource("areas", { path: "/areas" });
this.resource("area", { path: "/areas/:refId" }, function() {
this.route("new", { path: "/areas/new" });
});
さらに、'new' と 'area' はまったく同じビューとコントローラーを使用していました。したがって、問題は親ルート「area」とそのサブルート「new」の間でした。すべてを組み合わせて、コントローラー内で魔法をかけてどちらのケースかを区別しようとする試みは、お勧めできません...
したがって、解決策は次のとおりです。
- mixin を使用してコードの重複を回避します (「new」と「area」の両方で Google Geocoder のものを使用します)
- 以下に示すように、素敵でシンプルなルーティングを作成します。
そしてコードは
App.Router.map(function() {
this.route("areas", { path: "/areas" });
this.route("area", { path: "/areas/:refId" });
this.route("newarea", { path: "/area/new"});
});
それでおしまい。楽しんだりコメントしたり。専門家からの意見を得ることが常にうれしい