将记录附加到 RecordArray 并动态更新组件模板
Append record onto RecordArray and Dynamically update Component Template
这是呈现的组件的样子:
我期望的是,当我单击“添加对象”按钮时,它会创建一个新的 Rental
记录,并将该 Rental
记录附加到现有的 RecordArray
.由于 RecordArray
被跟踪,组件模板重新呈现,因此新记录的 title
属性显示在模板中。
当我点击按钮时,returns Web Inspector 出现这个错误:
Uncaught TypeError: this.myrentals.pushObject is not a function at MyCompComponent.addRental
对于此问题中引用的应用程序的基本设置,我使用的是 Ember Guides Tutorial App。
这是我router.js
中指定的路线
// router.js
import EmberRouter from '@ember/routing/router';
import config from './config/environment';
export default class Router extends EmberRouter {
location = config.locationType;
rootURL = config.rootURL;
}
Router.map(function() {
this.route('testing');
});
这是我的路线,returns rental
条中的 RecordArray
条记录:
// testing.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class IndexRoute extends Route {
@service store;
model() {
return this.store.findAll('rental');
}
}
这是我的 rental
模型:
// rental.js
import Model, { attr } from '@ember-data/model';
export default class RentalModel extends Model {
@attr title;
}
我的 testing
模板:
//templates/testing.hbs
<MyComp @rentals={{@model}} />
我的 MyComp
组件模板:
// components/my-comp.hbs
<h2>Practice Iterate over RecordArray and Add items</h2>
<ul>
{{#each @rentals as |rental| }}
<li>{{rental.title}}</li>
{{/each}}
</ul>
<button type="button" {{on "click" this.addRental}}>Add an object</button>
最后,我的 MyComp
组件 class:
// components/my-comp.js
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { A } from '@ember/array';
export default class MyCompComponent extends Component {
@tracked myRentals = this.args;
@action
addRental() {
this.myRentals.pushObject({
title: "My new rental"
});
}
}
我确实参考了 Ember JS Looping Through Lists Guide。我显然在这里工作时遗漏了一个或多个概念。
提前致谢!
我想通了!
组件模板如下:
//components/my-comp.hbs
<h2>Practice Iterate over RecordArray and Add items</h2>
<ul>
{{#each this.myRentals as |rental| }}
<li>{{rental.title}}</li>
{{/each}}
</ul>
<button type="button" {{on "click" this.addRental}}>Add an object</button>
这里是组件的 class:
// components/my-comp.js
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
export default class MyCompComponent extends Component {
@service store;
@tracked myRentals = this.args.rentals;
@action
addRental() {
this.myRentals.pushObject(this.store.createRecord('rental', {title: "test"}));
}
}
我需要更正一些细节:
- 我必须注入
store
然后将其设置为 属性。
- 为了获取作为参数传入
my-comp
模板的 rentals
变量,我需要通过 this.args.rentals
. 获取它
- 为了追加到
Rental
记录的 RecordArray
,我不得不用 this.store.createRecord
. 实例化 rental
记录
我希望这对其他人有帮助!
这是呈现的组件的样子:
我期望的是,当我单击“添加对象”按钮时,它会创建一个新的 Rental
记录,并将该 Rental
记录附加到现有的 RecordArray
.由于 RecordArray
被跟踪,组件模板重新呈现,因此新记录的 title
属性显示在模板中。
当我点击按钮时,returns Web Inspector 出现这个错误:
Uncaught TypeError: this.myrentals.pushObject is not a function at MyCompComponent.addRental
对于此问题中引用的应用程序的基本设置,我使用的是 Ember Guides Tutorial App。
这是我router.js
// router.js
import EmberRouter from '@ember/routing/router';
import config from './config/environment';
export default class Router extends EmberRouter {
location = config.locationType;
rootURL = config.rootURL;
}
Router.map(function() {
this.route('testing');
});
这是我的路线,returns rental
条中的 RecordArray
条记录:
// testing.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class IndexRoute extends Route {
@service store;
model() {
return this.store.findAll('rental');
}
}
这是我的 rental
模型:
// rental.js
import Model, { attr } from '@ember-data/model';
export default class RentalModel extends Model {
@attr title;
}
我的 testing
模板:
//templates/testing.hbs
<MyComp @rentals={{@model}} />
我的 MyComp
组件模板:
// components/my-comp.hbs
<h2>Practice Iterate over RecordArray and Add items</h2>
<ul>
{{#each @rentals as |rental| }}
<li>{{rental.title}}</li>
{{/each}}
</ul>
<button type="button" {{on "click" this.addRental}}>Add an object</button>
最后,我的 MyComp
组件 class:
// components/my-comp.js
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { A } from '@ember/array';
export default class MyCompComponent extends Component {
@tracked myRentals = this.args;
@action
addRental() {
this.myRentals.pushObject({
title: "My new rental"
});
}
}
我确实参考了 Ember JS Looping Through Lists Guide。我显然在这里工作时遗漏了一个或多个概念。
提前致谢!
我想通了!
组件模板如下:
//components/my-comp.hbs
<h2>Practice Iterate over RecordArray and Add items</h2>
<ul>
{{#each this.myRentals as |rental| }}
<li>{{rental.title}}</li>
{{/each}}
</ul>
<button type="button" {{on "click" this.addRental}}>Add an object</button>
这里是组件的 class:
// components/my-comp.js
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
export default class MyCompComponent extends Component {
@service store;
@tracked myRentals = this.args.rentals;
@action
addRental() {
this.myRentals.pushObject(this.store.createRecord('rental', {title: "test"}));
}
}
我需要更正一些细节:
- 我必须注入
store
然后将其设置为 属性。 - 为了获取作为参数传入
my-comp
模板的rentals
变量,我需要通过this.args.rentals
. 获取它
- 为了追加到
Rental
记录的RecordArray
,我不得不用this.store.createRecord
. 实例化
rental
记录
我希望这对其他人有帮助!