避免展示新模型本身

问题描述 投票:0回答:2

我有一个表单来创建一个名为“路线”的新模型。表单中有一个称为接管的选择字段,显示所有路由,用户可以选择一个来获取与所选路由的关系。 我的问题是,新创建的路线甚至可以在选择字段中选择,因为我只是返回“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(),

所以路线都是包括新车型在内的所有路线。但它不应该能够选择模型本身,所以我必须将其从路线中删除。我该怎么办?

javascript ember.js ember-data store
2个回答
1
投票

您可以使用计算属性来简单地按非新记录进行过滤

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
的记录,您可以类似地过滤这些记录以仅返回新的记录。
    


0
投票

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); }

	
© www.soinside.com 2019 - 2024. All rights reserved.