#3 给组件传递属性

英文原版:https://guides.emberjs.com/v2.14.0/components/passing-properties-to-a-component/

组件是与它所在的环境完全隔离的,所以任何组件需要的东西都必须要传递给它

比如,假设你现在有个blog-post组件用来展示博客:

app/templates/components/blog-post.hbs

<article class="blog-post">
  <h1>{{title}}</h1>
  <p>{{body}}</p>
</article>

继续假设,我们有如下模版和路由:

app/routes/index.js

import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.get('store').findAll('post');
  }
});
app/templates/index.hbs

{{#each model as |post|}}
  {{blog-post}}
{{/each}}

那么渲染结果将会如下:

<article class="blog-post">
  <h1></h1>
  <p></p>
</article>

为了使得模版中的信息得以被组件使用,我们必须要把数据作为组件的属性传递给它:

app/templates/index.hbs

{{#each model as |post|}}
  {{blog-post title=post.title body=post.body}}
{{/each}}

必须要注意的是,这些属性保持着同步状态。事实上是,如果组件中的属性的值发生了变化,那么这个变化会反映到组件外部与之相关连的变量上。在这个例子中,如果title属性的值改变了,那么post.title的值也会改变;反之亦然。

位置参数

除了可以根据参数名称来给组件传递参数之外,你可以根据参数的位置来处理参数。换句话说,上面的例子,可以改造成下面这样:

app/templates/index.hbs

{{#each model as |post|}}
  {{blog-post post.title post.body}}
{{/each}}

为了使得组件可以接收位置参数,你需要在组件中设置positionalParams 属性:

app/components/blog-post.js

import Ember from 'ember';

const BlogPostComponent = Ember.Component.extend({});

BlogPostComponent.reopenClass({
  positionalParams: ['title', 'body']
});

export default BlogPostComponent;

然后,你就可以使用title和body这两个属性了。

注意:positionalParams属性是通过reopenClass设置到组件类中的静态变量。所以,它在程序运行的时候是不能改变的。

或者,你可以通过数组的形式来接收任意数量的参数,这时候你需要把positionalParams的值设置为字符串“params“,通过params来获得参数列表中每一个参数:

app/components/blog-post.js

import Ember from 'ember';

const BlogPostComponent = Ember.Component.extend({
  title: Ember.computed('params.[]', function(){
    return this.get('params')[0];
  }),
  body: Ember.computed('params.[]', function(){
    return this.get('params')[1];
  })
});

BlogPostComponent.reopenClass({
  positionalParams: 'params'
});

export default BlogPostComponent;

本节完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值