将ModelFor('')与后退按钮结合使用时,Ember.js无法加载数据

aba*_*rax 5 javascript ember.js ember-data

我正在使用Ember数据和RESTAdapter以及Django的扩展.

这是一个JSBin

以下是我们的路线设置方式:

App.Router.map(function() {

    this.resource('locations');
    this.resource('location', {path:'locations/:location_id'}, function() {

        this.resource('items', function() {
            this.route('create');
        }); 

        this.resource('item', { path:'item/:item_id' }, function() {
            this.route('edit');
        });

    });
});

App.LocationsRoute = Ember.Route.extend({
    model: function () {
        return this.get('store').find('location');
    }
});


App.ItemsRoute = Ember.Route.extend({
  model: function(){
      //Get the model for the selected location and grab its item list.  
      //This will do a call to /locations/1/items
      return this.modelFor('location').get('items'); 
  }     
});
Run Code Online (Sandbox Code Playgroud)

现在,当我们导航到位置/ 1 /项目时,这一切都正常.向用户呈现与id为1的位置相关的项目列表.

当用户单击其中一个项目时,它会将URL带到#/ locations/1/item/1,并显示ID为1的项目的详细信息.

现在什么不起作用是这样的:

当我按下后退按钮时,#/ locations/1/items路由加载但它不再拥有其数据,并且不会发生对api/locations/1/items的REST调用.即使我们第一次导航到#/ locations/1/items时数据显示也很好.

就像Ember说的那样"我们已经加载了这些数据,所以我们不需要再次调用api"但是数据在某种程度上没有显示在我们的模板中.

如果我将ItemsRoute模型更改为:

return this.get('store').find('item');
Run Code Online (Sandbox Code Playgroud)

上面的场景非常好,但数据不是基于我们的位置.

使用this.modelFor有什么我缺少的东西吗?或者我的路线设置不正确?

如果您需要任何额外信息,请告诉我.

更新1:

将模型功能更改为此后,我发现了一些新的见解:

model: function(){
    //Get the model for the selected location and grab its item list.  
    //This will do a call to /locations/1/items
    var location = this.modelFor('location');
    var items = location.get('items');
    return items;
} 
Run Code Online (Sandbox Code Playgroud)

在第一次加载#/ locations/1/items时,location变量保存位置模型,而items变量包含具有'content'属性,'isFulfilled:true'和其他一些内容的东西.

这正确地工作并显示项目列表.当我点击某个特定项目并进入#/ locations/1/items/1然后点击后退按钮.断点触发器和位置仍使用位置模型正确填充.

但是items变量似乎只是一个PromiseArray,我需要以某种方式等待承诺在这个模型钩子返回之前完成吗?我以为Ember已经自动完成了吗?我想这意味着路径在履行承诺之前加载,这就是为什么没有显示数据?

因此我的列表没有正确填充.

aba*_*rax 2

好的,这是交易。我已经解决了这个问题,但不知道为什么它解决了这个问题。

无需再费周折:

这是我所拥有的确切设置的jsbin 示例。真实的和 jsbin 之间的唯一区别是我使用的是 RestAdapter 而不是 FixtureAdapter。这在技术上是不正确的,因为我使用的是ember-django-rest-adapter,它扩展了 REST 适配器。

问题中描述的问题不会出现在 jsbin 中,但ember-django-rest-adapter 的确切设置确实会出现该问题。

修复方法是打破用户 -> 站点 -> 项目 -> 用户之间的循环关系

例如,如果我注释掉用户模型中的“位置”关系,则后退按钮将起作用。

或者,如果我在项目模型中注释掉与用户的“所有者”关系,则后退按钮将起作用。

我可能会问一个单独的问题来看看问题背后的原因是什么,尽管如果有人可以解释为什么会发生这种情况,我会很乐意接受这里的答案。