Ember.js (PeepCode スクリーンキャストを購入) の学習を始めたばかりで、非常にスムーズに学習していますが、最初の Ember アプリを作成しようとしたときに問題が発生しました。
(ネストされた) ルート マッピングは次のとおりです。
App.Router.map(function () {
this.resource('bases', { path: '/' }, function () {
this.resource('base', { path: ':base_id' }, function () {
this.resource('places', function () {
this.resource('place', { path: ':place_id' });
});
});
});
});
これにより、次のような URL が許可されます: domain.com/#/yokota-ab-japan/places/4c806eabd92ea093ea2e3872
yokota-ab-japan
基地(日本の空軍基地)
4c806eabd92ea093ea2e3872
のIDです はFoursquareの会場のIDです
Places ルートにヒットしたら、foursquare API を呼び出してデータをセットアップし、JSON を繰り返し処理して App.Place オブジェクトの配列を作成し、その配列を返します。
App.PlacesRoute = Ember.Route.extend({
model: function () {
var placesData = Ember.A();
$.getJSON('https://api.foursquare.com/v2/venues/search?ll=35.744771,139.349456&query=ramen&client_id=nnn&client_secret=nnn&v=20120101',
function (data) {
$.each(data.response.venues, function (i, venues) {
placesData.addObject(App.Place.create({ id: venues.id, name: venues.name, lat: venues.location.lat, lng: venues.location.lng }));
});
});
return placesData;
}
});
それはうまくいくようです。このテンプレートを使用して、placesData 配列を表示します。
<script type="text/x-handlebars" data-template-name="places">
<div>
{{#each place in controller}}
{{#linkTo 'place' place}}
{{place.name}}
{{/linkTo}}
{{/each}}
</div>
{{outlet}}
</script>
linkTo
場所の詳細を表示したい個々の場所へのリンク。単一の場所に関するデータを取得し、単一の App.Place オブジェクトを設定して返すように設定したルートは次のとおりです。
App.PlaceRoute = Ember.Route.extend({
model: function (params) {
console.log('place route called');
var place;
$.getJSON('https://api.foursquare.com/v2/venues/' + params.place_id + '?client_id=nnn&client_secret=nnn',
function (data) {
var v = data.response.venue;
place = App.Place.create({ id: v.id, name: v.name, lat: v.location.lat, lng: v.location.lng });
});
return place;
}
});
私の問題は、PlaceRoute
ユーザーがリンクをクリックしたときに呼び出されないことですが、このルートでページが更新されたときに呼び出されます。
PeepCode Ember.js スクリーンキャスト (ビデオの ~12:25) によると、「コントローラーがデータを呼び出すことはめったになく、ルート オブジェクトがそれを処理する」と記載されているため、ajax 呼び出しをルート (私は非常に多くの異なるチュートリアルをオンラインで見てきましたが、Peepcode が Ember.js 作成者に相談したので、私はそれを主要な学習ソースとして使用しました)。
これが正しくない場合、または改善できる場合は、お知らせください。