我目前正在评估Ember.js,因此我正在构建一个小样本应用程序。目前到目前为止一切都很顺利,但现在我似乎无法解决我的最后一个小问题。
当我通过路线电影正常访问应用程序时,一切都按预期工作。显示电影列表。现在,当我点击一部电影时,电影的细节通过电影列表下方的setupController
挂钩加载。这一切都很好。
我的问题出现了:我希望能够通过网址直接访问电影详细信息,但不知何故,在这种情况下会触发另一个请求以获取电影详细信息,其值为undefinded
。据我所知,这是model
挂钩。
我只能猜测,但我认为这是model
钩子正在执行。
有人能指出我正在犯的可能明显的错误吗?而另一方面,到目前为止我写的代码是“正确的”吗?或者有更好的方法吗?
(我知道用于渲染电影细节的不好方法。我将删除{{#each}}
标记,并更改我将响应设置为film
变量的方式。
此处是示例应用的链接:http://jsbin.com/ewiN/1#/films
更新
好的,现在我真的很困惑。我几乎让它工作,希望有人可以指出我,因为这是一个如此简单的任务,但如果不了解ember真的很好......
通过url访问应用程序时,它仅在我删除setupController
挂钩时才有效。但是我需要这个钩子,在点击链接时加载FilmDetails
以正确加载FilmDetails
。
http://jsbin.com/ewiN/16#/films/tt0100669
非常感谢您的反馈! 问候 雷托
答案 0 :(得分:1)
不使用jQuery.getJSON
,而是使用Ember.RSVP.Promise
,因为内部ember使用此promise api而不是jquery。我认为使用两者,可能会产生不一致。
return new Ember.RSVP.Promise(function(resolve, reject) {
var films = [];
jQuery.getJSON("http://www.omdbapi.com/?s=" + searchTerm, function (response) {
$.each(response.Search, function (index, value) {
films.pushObject(Kitag.Films.create({
title: value.Title,
id: value.imdbID
}));
});
}).fail(reject);
resolve(films);
});
因为我们正在返回一个promise而不是一个对象,所以我们需要使用模型钩子,因为它等到promise被解析为呈现模板。
Kitag.FilmsRoute = Ember.Route.extend({
model: function() {
return Kitag.Films.getMovies('spiderman');
}
});
我删除了Kitag.FilmRoute
,因为预期:
Kitag.FilmRoute = Ember.Route.extend({
model: function(params) {
return Kitag.Film.find(params.id)
},
serialize: function (model) {
return { film_id: model.get("id") };
}
});
是默认值。