我一直在做很多修修补补,似乎无法让它发挥作用。我希望在等待我的模型承诺返回时显示我的加载模板。
我的理解是,默认情况下,如果我有app/templates/loading.hbs
,则此模板将在所有路线上呈现。但是,即使在我在路线之间切换时使用该模板,旧路线仍会显示,直到模型返回,此时我的液体火焰转换发生并且您将被带到下一条路线。
我尝试过为每个路由创建嵌套加载模板的各种版本,尝试为加载模板的每个路由创建子路由,甚至搞乱了可用的beforeModel / afterModel方法,但我没有进展。这是我在发布之前想要跨越的最后一个障碍,并且为什么我无法使其工作感到困惑。以下是我认为相关的一堆代码。
注意:我使用的是Ember CLI和Liquid Fire。我的数据也暂时从Ember Service返回给模型。
路由器
Router.map(function() {
this.route('reviews', function() {
this.route('index', {path: '/'});
this.route('review', {path: '/:review_id'});
});
this.route('movies');
this.route('about');
});
应用/模板/ loading.hbs
<div class="content-container">
<h1>Ish be loading</h1>
</div>
最慢的模型路线
export default Ember.Route.extend({
activate() {
this._super();
$("html,body").animate({scrollTop:0},"fast");
$("body").addClass('movies');
},
deactivate() {
$("body").removeClass('movies');
},
model() {
const movies = this.get('movies');
return movies.getMoviesInAlphOrder();
},
afterModel: function() {
$(document).attr('title', 'Slasher Obscura - Movie Database');
},
movies: Ember.inject.service()
});
app.js
App = Ember.Application.extend({
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver,
...
});
loadInitializers(App, config.modulePrefix);
服务方法
sortReviewsByDateDesc(arr) {
return arr.slice().sort(function (a, b) {
return a.review.date > b.review.date ? -1 : 1;
});
},
getSetAmountOfMovies(num, arr) {
const movieList = arr ? null : this.getMovies();
const trimmedList = arr ? arr.slice(0, num) : movieList.slice(0, num);
return trimmedList;
},
setFirstReviewToFeatured(arr) {
arr[0].isFeatured = true;
return arr;
},
getLatestReviews(num) {
const movieList = this.getMovies();
const reviewList = movieList.filterBy('review');
const indexList = this.sortReviewsByDateDesc(reviewList);
const latestList = this.getSetAmountOfMovies(num, indexList);
return this.setFirstReviewToFeatured(latestList);
},
getMoviesInAlphOrder() {
const movieList = this.getMovies();
let lowerCaseA, lowerCaseB;
return movieList.sort(function(a, b) {
lowerCaseA = a.title.toLocaleLowerCase();
lowerCaseB = b.title.toLocaleLowerCase();
return lowerCaseA.localeCompare(lowerCaseB);
});
},
getMovies() {
return [{
id: 1,
title: '303 Fear Faith Revenge',
year: "1999",
imdb: "tt0219682",
youtube: "iFV1qaUWemA"
}
...
]
我已经阅读了Ember网站上的文档以及其他各种Google资源,似乎无法弄清楚为什么我的加载模板根本无法渲染。任何帮助都是极好的!谢谢!
答案 0 :(得分:6)
当模型挂钩返回需要很长时间才能解析的promise时,会触发加载模板,但是,模型挂钩不会返回promise。
model() {
const movies = this.get('movies');
return movies.getMoviesInAlphOrder();
}
getMoviesInAlphOrder
正在返回一个同步数组。在与你进一步交谈之后,事实证明你已经为这个阵列客户端预先填充了540个项目,所以这里的问题是加载模板不仅没有等待的承诺,而且即使它确实无论如何它会立即解决。
您的时间延迟很可能是因为呈现一长串项目而导致的性能问题。有几个Ember插件可以帮助解决这个问题,包括我自己的一个:https://github.com/runspired/smoke-and-mirrors
另外/另外你可能想要将你的数组“分块”为更小的位并一次渲染25-50,或者设置一些分页。