第一次请求后,Ember不按ID请求模型

时间:2013-08-20 04:17:20

标签: ember.js

SO,

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

dataset
数组并链接到模板以显示有关每个
dataset
的更多详细信息,这些信息在进行请求时会被加载通过id找到。 (即find(1),其中1是id。)

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

如何在访问时返回所有特定数据集对象,而不会在索引处进行hacky进站?任何建议将不胜感激,谢谢你提前!

代码:

-app.js


    /**************************
    * Application
    **************************/
    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({
        model: function() {
            return App.Dataset.find();
        }
    });

    App.DatasetRoute = Em.Route.extend({
        activate: function() {
            this.modelFor('dataset').reload();
        }
    });

    /**************************
    * Models
    **************************/
    App.Store = DS.Store.extend({
        adapter: DS.RESTAdapter.create({
            url: 'http://***.***.***.***:5000',
            namespace: 'api',
            serializer: DS.RESTSerializer.extend({
                primaryKey: function(type) {
                    return '_id';
                }
            })
        })
    });

    App.Dataset = DS.Model.extend({
        dataset: DS.attr('string'),
        title: DS.attr('string'),
        points: DS.hasMany('App.Point')
    });

    App.Point = DS.Model.extend({
        dataset: DS.attr('string'),
        dataset_id: DS.attr('string'),
        date: DS.attr('date'),
        value: DS.attr('string')
    });

1 个答案:

答案 0 :(得分:3)

路由的activate挂钩仅在路由首次转换到时才会被调用。如果路线的模型发生变化,则再次调用 。因此,当您通过直接输入URL或通过单击索引页面上的链接转换到App.DatasetRoute时,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')
}