我有一个表单来创建一个名为“路线”的新模型。表单中有一个称为接管的选择字段,显示所有路由,用户可以选择一个来获取与所选路由的关系。 我的问题是,新创建的路线甚至可以在选择字段中选择,因为我只是返回“this.get('store').findAll('routes');”。 我如何从选择中删除新模型,因为不可能创建与其自身的关系。
在路线中,我创建一个空模型,然后用户可以修改表单中的属性:
//route.js
model() {
return this.store.createRecord('route', {});
},
模板:
//route.hbs
<form>
//some fields
//and a select-component:
{{my-select
selected=model.takeover
options=routes
}}
</form>
我在路线中提供给可选选项的路线:
//route.js
routes: Ember.computed(function () {
return this.get('store').findAll('route');
}).readOnly(),
所以路线都是包括新车型在内的所有路线。但它不应该能够选择模型本身,所以我必须将其从路线中删除。我该怎么办?
您可以使用计算属性来简单地按非新记录进行过滤
routes: Ember.computed.filterBy('model', 'isNew', false)
isNew
适用于尚未持久化的模型(即您还拥有 .save()
)。 您可以在这里阅读更多相关信息:http://emberjs.com/api/data/classes/DS.Model.html#property_isNew
我会将对商店的请求与过滤列表的 CP 分开。这样我们就有了向模型挂钩中的后端/存储发出请求的逻辑(它应该在的位置),然后将结果发送到我们的控制器,这是我们用于过滤的 CP 可以驻留的地方。
编辑回复评论:
通常,Ember 希望对后端的请求存在于路由文件中。它旨在访问商店并配备异步错误处理功能。 您通常会在模型挂钩中请求此操作:
// route.js
model() {
return this.get('store').findAll('route');
}
如果您也想在这里创建一条新记录,您可以这样做:
// route.js
model() {
this.get('store').createRecord('route');
return this.get('store').findAll('route');
}
model
钩子的结果将传递给 setupController
方法。该方法会自动触发,并且它是构建控制器对象的方法。控制器将模型传达给您的视图。 这是它默认执行的操作:
setupController(controller, model) {
controller.set('model', model);
}
您不必在此处覆盖任何内容,但最好知道控制器何时为我们创建。
现在我们可以将此计算属性添加到我们的控制器中。默认情况下,您很可能没有controller.js 文件。您可以使用 Ember-CLI 生成一个:
ember g controller <route-name>
由于
model
已传递到我们的控制器,我们可以添加一个过滤模型的计算属性:
// controller.js
routes: Ember.computed.filterBy('model', 'isNew', false)
这将是所有非“新”记录的数组。 现在我们的视图应该可以访问
route
。routes
我不确定
//route.hbs
<form>
//some fields
//and a select-component:
{{my-select
selected=model.takeover
options=routes
}}
</form>
指的是什么。但是,如果您想获取
model.takover
的记录,您可以类似地过滤这些记录以仅返回新的记录。isNew
更新:
如果可能,不要使用
routes: Ember.computed(function () {
return this.get('store').findAll('route').then(function(result){
return result.filterBy('isNew', false);
});
}).readOnly(),
或
route
作为路线名称和计算属性名称。 在route.js中
routes
在route.hbs模板中,
model(){
return Ember.RSVP.hash({
newRecord: this.store.createRecord('route', {}),
routes : this.get('store').findAll('route').then(function(result){
return result.filterBy('isNew', false);
}),
});
},
setupController(controller,model){
this._super(...arguments);
controller.set('NewRecordModel',model.newRecord);
controller.set('routes',model.routes);
}