具有嵌套路由的Ember.js model-和setupController-hook

时间:2013-08-22 06:53:46

标签: javascript ember.js

我目前正在评估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

非常感谢您的反馈! 问候 雷托

1 个答案:

答案 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") };
    }
});

是默认值。

这是最终结果http://jsbin.com/ewiN/15/edit