TransitionToRoute不会挂钩模型

时间:2013-10-03 08:11:52

标签: ember.js ember-data

我在控制器中有一个功能,用于检查是否可以通过transtionToRoute更改路径

首先,我使用本地存储适配器创建一个新记录,然后我想更改路由:

 var i = this.store.createRecord('axisModel', {
            id: Math.random().toString(32).slice(2).substr(0, 5), //random ID generator
            uniqueName: item.uniqueName,
            name: item.name,
            hierarchyUniqueName: item.hierarchyUniqueName,
            type: 'filter',
            isMeasure: item.isMeasure,
            orderId: "",
            isActive: true
        });
        i.save();
this.transitionToRoute('filters', item);

过滤器路由代码是这样的:

App.FiltersRoute = Ember.Route.extend({
model:function(params){
    console.log('here');
    return this.store.find('axisModel',params.filters_id);
}
});

但是当路线发生变化时,我看不到console.log()的'here',我也得到了这个错误:

Assertion failed: Error while loading route: TypeError: Object [object Object] has no method 'addArrayObserver'

3 个答案:

答案 0 :(得分:1)

我认为您在each模板中使用filters视图助手并引用模型,但它不是数组的对象:

{{#each}} ...

{{#each model}} ...

因此您将收到此错误,因为视图助手将尝试添加观察者以在阵列更改时更新ui。但是ember对象没有addArrayObserver方法,并且会抛出此错误。

您可以删除每个,或者如果您希望获得多个结果,请使用store.filter

this.store.filter('axisModel', function(model) {
  model.get('someProperty') == otherProperty;
});

答案 1 :(得分:1)

如果要查询记录数组,find的第二个参数应该是带查询参数的对象,例如。

model: function(params) {
  return this.store.find('axisModel', { filter: params.filters_id });
}

由于您只是传递一个ID,您将查询单个记录(具有该ID),并且您生成的控制器将是一个ObjectController(而不是ArrayController),它不能与#each一起使用。

答案 2 :(得分:0)

当您在内部转换到路线时,在您的Ember应用中,使用link-totransitionTotransitionToRoute会跳过model挂钩。 Ember希望您在转换时将要使用的模型传递到路径中。这就是为什么你没有像你期望的那样看到console.log陈述。

另一个可能的问题是,当你这样称呼时:

this.transitionToRoute('filters', item)

您提供的单个项目为model路由的'filters'。但是如果你要重新加载,并且要触发model钩子,那么你将使用以下命令返回一个集合:

this.store.find('axisModel',params.filters_id)