1

我目前正在评估 Ember.js,因此我正在构建一个小型示例应用程序。目前到目前为止一切都很顺利,但现在我似乎无法解决我的最后一个小问题。

当我通过路线电影正常访问应用程序时,一切都按预期工作。显示电影列表。setupController现在,当我单击电影时,电影的详细信息会通过电影列表下方的钩子加载。这一切都很好。

我的问题来了:我希望能够直接通过 url 访问电影详细信息,但在这种情况下,不知何故,另一个请求被触发以获取电影详细信息,值为undefinded. 据我了解,这是model钩子。

我只能猜测,但我认为这是model正在执行的钩子。

有人可以指出我正在犯的可能明显的错误吗?另一方面,到目前为止我编写的代码是否“正确”?或者有没有更好的方法来做到这一点?

(我知道我用来渲染电影细节的糟糕方式。我将删除{{#each}}标签,并更改我将响应分配给film变量的方式。

这里是示例应用程序的链接:http: //jsbin.com/ewiN/1#/films

更新

好的,现在我真的很困惑。我几乎可以使用它,希望有人可以向我指出,因为这是一项非常简单的任务,但是如果不真正了解 ember 似乎几乎不可能做到...当通过 url 访问应用程序时,它仅在我删除时才有效setupController钩子。但我需要那个钩子来加载FilmDetails点击链接以正确加载FilmDetails.

http://jsbin.com/ewiN/16#/films/tt0100669

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

4

1 回答 1

1

而不是 use jQuery.getJSON, use 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

于 2013-08-22T12:54:16.780 回答