从ember组件类获取ember组件的属性

波尔图

我一直在尝试从组件类的操作中获取组件属性的值。我的主要目标是关联两个对象:传递到组件中的“拍卖”(如下代码所示)

new.hbs

<AuctionForm 
    @auction={{@model.auction}}
    @products={{@model.products}}/>

将所选产品放在“ AuctionForm”组件内的选择标签上,如下所示:

拍卖表格

<div class="row">
    <label for="product">Produto</label>
    <select name="product" onchange={{action 'selectProduct' value='target.value'}}>
        <option value="" selected='selected' disabled='disabled'>-------</option>
        {{#each @products as |product|}}
            <option value="{{product.id}}" selected={{if (equalstr product.id @auction.product.id) 'selected'}}>{{product.name}}</option>
        {{/each}}
    </select>
</div>

我想在类的“ selectProduct”操作上绑定这两个对象:

拍卖form.js

import Component from '@glimmer/component';
import { action } from '@ember/object';


export default class AuctionFormComponent extends Component {
    @action selectProduct(product) {
        this.get('auction').set('product', product); // this doesn't work on ember newest version
    }
    @action save(auction) {
        auction.save();
    }
}

虽然,每当我尝试通过“ this.get()”函数在组件类上访问其值时(就像我以前在余烬版本中所做的那样),我都会收到一条错误消息,指出“ this.get不是函数” 。

在网络上大量研究之后,我找不到直接的解决方案,也没有文档提供的官方解决方案。

我最接近解决方案的是将“拍卖”声明为计算属性(https://api.emberjs.com/ember/3.22/classes/Component)。但是,一旦它的结构(如下面的代码)仅适用于TypeScript文件,就无法在javascript文件上实现它。

import Component from '@glimmer/component';
import { action } from '@ember/object';
import { computed } from '@ember/object';


export default class AuctionFormComponent extends Component {
    auction: computed('auction', function() {
        return this.auction;
    }
    @action selectProduct(product) {
        debugger;
        this.get('auction').set('product', product);
    }
    @action save(auction) {
        auction.save();
    }
}

有谁知道在ember 3.22中执行此类任务的正确方法?

非常感谢你。

戈库·卡希尔维尔

由于您使用的是最新的Glimmer组件(从中导入@glimmer/component),

  1. 必须通过js类中args属性访问参数,例如this.args.auction

  2. 参数(auctionproducts)在组件内部不可更改。要更改参数的值,我们可以向父级发送操作以更改值。

  3. getset方法不是在微光组件可用。这些方法是经典余烬组件的一部分。您可以使用点[。]表示法访问类的属性,例如:,this.auction并使用赋值语句像this.property = 'value'

  4. 由于您使用的是本机类语法,action: computed(..)因此不是有效的声明。

  5. 要绑定事件,建议使用on修饰符和fn助手

通过结合所有观点,

import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class AuctionFormComponent extends Component {
    @action 
    selectProduct(event) {
        // This `updateProduct` has to be implemented in parent class 
        // which mutates the `auction` object.
        this.args.updateProduct(event.target.value); // -> `on` modifier will capture the native event
    }

    @action 
    save(auction) {
        auction.save();
    }
}
<div class="row">
    <label for="product">Produto</label>
    <select name="product" {{on "change" this.selectProduct}}>
        <option value="" selected='selected' disabled='disabled'>-------</option>
        {{#each @products as |product|}}
            <option value="{{product.id}}" selected={{if (equalstr product.id @auction.product.id) 'selected'}}>{{product.name}}</option>
        {{/each}}
    </select>
</div>

调用就像

<AuctionForm 
    @auction={{@model.auction}}
    @products={{@model.products}}
    @updateProduct={{this.updateProduct}}
/>

在这里,updateProduct需要正确实施以更新产品。


编辑:正如@BPorto在评论中提到的那样,将Ember辛烷值迁移备忘单从经典的余烬模型迁移到Octane模型时将非常方便。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Ember组件获取所有传入的attrs

来自分类Dev

Ember:访问Ember组件中的数据存储

来自分类Dev

Ember js控制重复组件中的类绑定

来自分类Dev

把手在Ember组件的简单属性上循环

来自分类Dev

如何将数组属性传递给Ember组件?

来自分类Dev

在Ember中从组件内部更改属性值

来自分类Dev

如何在ember.js的组件中获取商店

来自分类Dev

在Ember组件中获取当前路线的模型

来自分类Dev

Ember - 在测试中获取组件中元素的动态输入值

来自分类Dev

Ember 无法从模板到组件获取选择值

来自分类Dev

组件内的 Ember 集成测试组件

来自分类Dev

Ember this 在组件的组件中未定义

来自分类Dev

从Ember 2.3.0版开始,组件“属性”与组件“属性”之间有区别吗?

来自分类Dev

Ember组件的动态模板参数

来自分类Dev

加载时重置Ember组件

来自分类Dev

Ember组件中的共享状态

来自分类Dev

在组件中操纵Ember模型

来自分类Dev

Ember组件的动态模板参数

来自分类Dev

Ember组件中的异步加载

来自分类Dev

在列表中使用Ember组件

来自分类Dev

在组件中操纵Ember模型

来自分类Dev

没有包装在.ember-view类中的Ember组件?

来自分类Dev

Ember-子组件通过父组件更新来自查询参数的属性

来自分类Dev

Ember组件可以在不传入模板的情况下继承父组件的属性吗?

来自分类Dev

将Ember组件追加到非Ember管理的DOM元素

来自分类Dev

如何在 Ember 3.8 中调用嵌套的 ember 组件

来自分类Dev

子目录中的Ember组件

来自分类常见问题

Ember.js中的视图与组件

来自分类Dev

在Ember组件测试中模拟用户输入