0

我在控制器中有一个功能,可以检查是否正常使用 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()的“这里”,而且我得到这个错误:

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

3 回答 3

1

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

{{#each}} ...

或者

{{#each model}} ...

所以你会收到这个错误,因为视图助手会在数组改变时尝试添加观察者来更新用户界面。但是 ember 对象没有addArrayObserver方法,会抛出这个错误。

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

this.store.filter('axisModel', function(model) {
  model.get('someProperty') == otherProperty;
});
于 2013-10-03T12:19:31.150 回答
1

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

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

由于您只是传递一个 ID,因此您将查询单个记录(使用该 ID),并且您生成的控制器将是一个 ObjectController(而不是 ArrayController),它不适用于#each.

于 2013-10-03T22:59:01.427 回答
0

当您从 Ember 应用程序内部转换到路由时,使用link-to,transitionTo或钩子将被跳过transitionToRoutemodelEmber 希望您在转换时将要使用的模型传递到路由中。这就是为什么您没有看到console.log预期的声明。

另一个可能的问题是,当您调用它时:

this.transitionToRoute('filters', item)

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

this.store.find('axisModel',params.filters_id)
于 2013-10-04T19:08:24.083 回答