避免展示新模型本身
Avoid showing new model itself
我有一个表单可以创建一个名为 Route 的新模型。表单中有一个名为 takeover 的 select 字段,显示所有路线,用户可以 select 获得与 selected 路线的关系。
我的问题是新创建的 Route 在 select 字段中甚至 selectable,因为我只是 return 'this.get('store').findAll('routes');'.
我如何从 selection 中删除新模型,因为无法与自身建立关系。
在路由中我创建了一个空模型,然后用户可以修改表单中的属性:
//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>
我在路线中也给 select 可用选项的路线:
//route.js
routes: Ember.computed(function () {
return this.get('store').findAll('route');
}).readOnly(),
因此路线是包括新模型在内的所有路线。但它不应该能够 select 模型本身,所以我必须将它从路线中删除。我该怎么做?
您可以使用计算 属性 来简单地过滤不是新的记录
routes: Ember.computed.filterBy('model', 'isNew', false)
isNew
对于尚未持久化的模型是正确的(即你已经 .save()
了)。您可以在这里阅读更多相关信息:http://emberjs.com/api/data/classes/DS.Model.html#property_isNew
我会将对商店的请求与过滤列表的 CP 分开。这样我们就有了在模型挂钩(它应该在的地方)中向我们的 backend/store 发出请求的逻辑,然后将结果发送到我们的控制器,这是我们用于过滤的 CP 可以存在的地方。
编辑回复评论:
"Ember way"
通常,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
记录的数组,这些记录不是 "new." 现在我们的视图应该可以访问 routes
.
//route.hbs
<form>
//some fields
//and a select-component:
{{my-select
selected=model.takeover
options=routes
}}
</form>
我不确定 model.takover
指的是什么。但是如果你想获得 isNew
的记录,你可以类似地过滤这些记录以 return 只有新的记录。
试试这个,
routes: Ember.computed(function () {
return this.get('store').findAll('route').then(function(result){
return result.filterBy('isNew', false);
});
}).readOnly(),
更新:
如果可能,不要将 route
或 routes
作为您的路线名称和计算的 属性 名称。
在route.js
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);
}
并在 route.hbs 模板中,
{{my-select
selected=NewRecordModel.takeover
options=routes
}}
我有一个表单可以创建一个名为 Route 的新模型。表单中有一个名为 takeover 的 select 字段,显示所有路线,用户可以 select 获得与 selected 路线的关系。 我的问题是新创建的 Route 在 select 字段中甚至 selectable,因为我只是 return 'this.get('store').findAll('routes');'. 我如何从 selection 中删除新模型,因为无法与自身建立关系。
在路由中我创建了一个空模型,然后用户可以修改表单中的属性:
//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>
我在路线中也给 select 可用选项的路线:
//route.js
routes: Ember.computed(function () {
return this.get('store').findAll('route');
}).readOnly(),
因此路线是包括新模型在内的所有路线。但它不应该能够 select 模型本身,所以我必须将它从路线中删除。我该怎么做?
您可以使用计算 属性 来简单地过滤不是新的记录
routes: Ember.computed.filterBy('model', 'isNew', false)
isNew
对于尚未持久化的模型是正确的(即你已经 .save()
了)。您可以在这里阅读更多相关信息:http://emberjs.com/api/data/classes/DS.Model.html#property_isNew
我会将对商店的请求与过滤列表的 CP 分开。这样我们就有了在模型挂钩(它应该在的地方)中向我们的 backend/store 发出请求的逻辑,然后将结果发送到我们的控制器,这是我们用于过滤的 CP 可以存在的地方。
编辑回复评论:
"Ember way"
通常,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
记录的数组,这些记录不是 "new." 现在我们的视图应该可以访问 routes
.
//route.hbs
<form>
//some fields
//and a select-component:
{{my-select
selected=model.takeover
options=routes
}}
</form>
我不确定 model.takover
指的是什么。但是如果你想获得 isNew
的记录,你可以类似地过滤这些记录以 return 只有新的记录。
试试这个,
routes: Ember.computed(function () {
return this.get('store').findAll('route').then(function(result){
return result.filterBy('isNew', false);
});
}).readOnly(),
更新:
如果可能,不要将 route
或 routes
作为您的路线名称和计算的 属性 名称。
在route.js
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);
}
并在 route.hbs 模板中,
{{my-select
selected=NewRecordModel.takeover
options=routes
}}