我刚开始学习 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' });
});
});
});
});
这允许这样的网址:domain.com/#/yokota-ab-japan/places/4c806eabd92ea093ea2e3872
yokota-ab-japan
是基地的 id(日本的空军基地)
4c806eabd92ea093ea2e3872
是 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 的创建者后,我将它作为我的主要学习资源)。
如果这不正确,或者可以做得更好,请告诉我。