1

所以,

我正在开发 Ember 应用程序并遇到一个令人困惑的问题。在索引路由应用程序执行 find() 并返回一个数组

数据集
并链接到模板以显示有关每个模板的更多详细信息
数据集
当请求通过 id 查找时,它们会被侧载。(即 find(1),其中 1 是 id。)

带有 id 的第一个请求工作正常,返回数据集对象及其侧载数据,但是后续请求似乎没有做任何事情。如果我在加载第一个数据集的详细信息后尝试导航到任何其他数据集,则服务器看不到任何请求。但是,如果我从特定数据集导航回索引,然后返回到任何数据集,它将再次发送请求(甚至两次,不确定这是否是相关问题)并正常工作。换句话说:
/# 有效
/#/1 也有效(或任何其他 id,只要它是第一个访问的)
/#/1 然后 /#/2 无效,不发送请求
/#/1 随后通过 /# 然后 /#/2确实有效,将数据维护在 /#/1 并获取 /#/2 的新数据。

如何让所有特定的数据集对象在访问它们时返回,而不在索引处出现 hacky 进站?任何建议将不胜感激,在此先感谢您!

编码:

-app.js

    /******************************
    * 应用
    ******************************/
    var App = Em.Application.create();

    App.Router.map(function() {
        this.resource('application', {path:'/'}, function() {
            this.resource('dataset', {path: '/:dataset_id'}, function() {

            });
        });
    });

    App.ApplicationRoute = Em.Route.extend({
        模型:函数(){
            返回 App.Dataset.find();
        }
    });

    App.DatasetRoute = Em.Route.extend({
        激活:函数(){
            this.modelFor('dataset').reload();
        }
    });

    /******************************
    * 楷模
    ******************************/
    App.Store = DS.Store.extend({
        适配器:DS.RESTAdapter.create({
            url: 'http://***.***.***.***:5000',
            命名空间:'api',
            序列化器:DS.RESTSerializer.extend({
                主键:功能(类型){
                    返回'_id';
                }
            })
        })
    });

    App.Dataset = DS.Model.extend({
        数据集:DS.attr('string'),
        标题:DS.attr('string'),
        积分:DS.hasMany('App.Point')
    });

    App.Point = DS.Model.extend({
        数据集:DS.attr('string'),
        dataset_id: DS.attr('string'),
        日期:DS.attr('日期'),
        值:DS.attr('string')
    });

4

1 回答 1

3

路由的activate钩子仅在路由第一次转换到时才被调用。如果路由的模型发生变化,则不会再次调用它。因此,当您App.DatasetRoute通过直接输入 url 或单击索引页面上的链接转换到时,activate挂钩运行并重新加载您的数据集。当您从 切换#/1到 时#/2,路由保持活动状态并且不会调用任何挂钩。

如果我正确理解您的问题,您希望在用户访问其网址时重新加载数据集。在这种情况下,您可能想要做的是观察数据集控制器内容的变化,而不是路由的激活钩子。像这样的东西应该工作:

App.DatasetController = Ember.ObjectController.extend({
  refreshOnChange: function() {
    var dataset = this.get('content');
    if (dataset) {
      console.log('reloading dataset ', dataset.toString());
      dataset.reload();
    }
  }.observes('content')
}
于 2013-08-20T04:57:00.980 回答