0

在我的应用程序中,我的路线图中有共同的父/子关系。

App.Router.map(function () {
    this.resource('strats', {path: "/"}, function() {
        this.route('strat', {path: "/strat/:strat_id"});
    });
});

我的理解是,Ember第一次进入父路由时,会调用find()获取所有模型,一般会触发对服务器的Ajax调用。然后当 Ember 随后转换到子路由时,它首先调用 find(),然后调用 find(id)。如果我正在使用具有身份映射实现的数据层(例如 Ember-Data 或 Ember-Model),这些对 find() 和 find(id) 的后续调用应该会导致从本地内存中获取数据,而 Ember只要应用程序正在运行,就不必因为调用这些函数而向服务器发起另一个 Ajax 调用。如果这种理解是正确的,那么我应该不必在服务器端实现 find(id) 。

我在我的应用程序中使用 Ember-Model。当我在路由之间导航时,我看到服务器端对单个模型的请求偶尔会通过,这意味着对 find(id) 的调用有时会触发对服务器的 Ajax 调用,这是出乎意料的。我上面描述的逻辑中的缺陷在哪里?

4

1 回答 1

0

首先,Ember 本身只做模型钩子告诉它做的事情。

只有当您重新访问该路线时,才会调用这些钩子。我将在上面使用您的路由器给出一些示例。

App.Router.map(function () {
    this.resource('cow');
    this.resource('strats', {path: "/"}, function() {
        this.route('strat', {path: "/strat/:strat_id"});
    });
});
  1. 我参观了Strats路线。该路线的模型挂钩(StratsRou​​te)将被击中(在您的情况下,一个查找,返回多个层)。

  2. 我访问了strat/1 路线。路线的模型挂钩 (StratsStratRoute) 将被命中 (find(1))

  3. 我访问了strat/2 路线。路线的模型挂钩 (StratsStratRoute) 将被命中 (find(2))

  4. 我参观了奶牛路线(在地层之外)。

  5. 我访问了strat/1 路由,每条路由的模型钩子都会被调用,每次1 个到strat 路由。StratsRou​​te 将被调用,直到该模型被返回,它会等待,一旦它返回,它将转到 StratsStratRoute 路由并等待直到解决,一旦解决,它将继续渲染页面等。

有趣的是 Ember 模型有一个有趣的功能,你可以使用findfetch. find将建立一个虚拟记录并立即返回它,一旦返回 ajax 它将更新模型。 fetch将返回一个承诺,一旦 ajax 返回并且记录完全建立,它将解决该承诺。

请注意,在 find 方法中存在一些竞争条件。想象一下,如果你确实在 strats 路由中找到(),然后在 str 路由中找到(1)。它们都将立即解决(使用虚拟记录)并且都调用服务器。第一次调用将针对所有记录(可能包括 1),第二次调用针对记录 #1。所以我们只打了 2 个电话来记录一个,这有点浪费。在这种情况下,fetch 会更好。让我们用 fetch 来考虑一下。fetch 在 Strats 路线中,现在我们等到它解决。一旦它被解析(也就是服务器返回了所有模型),我们点击了strat 路由,它确实 fetch(1) 并且它没有点击服务器,它知道它已经有模型 1,它在 strats 路由中下降,所以它不发出ajax请求,它立即解决。

希望这可以清除一些灰尘。

于 2013-11-24T22:16:04.920 回答