您的位置:首页 > Web前端 > JavaScript

#3 给组件传递属性

2017-07-08 23:32 351 查看
英文原版: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;


本节完
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息