在ember.js文档的Wrapping Content in 【原创不易,请尊重版权】原创内容,盗版必究。a Component和Using Block Params两节中,在文档里面出现了这样一段模板代码转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net:
【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。et 获取更多精彩内容】【版权所有,侵权必究】【作者:唐霜】转载请注明出处:www.tangshua【转载请注明来源】【转载请注明来源】ng.net{{#blog-post editStyle="markdown" as |post|}} <p class="author">by {{author}}</p> {{post.body}} {{/blog-post}}
当我看到as |post|的时候就懵圈儿【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。了。在前面的文档中有{{#each model as |item|}}{{/each}}的用法,但是此处的as |post|显然【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】是和each遍历不同的。花了一些时间,把【原创内容,转载请注明出处】原创内容,盗版必究。这个问题搞清楚了。
yield的意思就是“传给”的意思,只要【本文受版权保护】【版权所有,侵权必究】在使用{{#}}{{/}}这种块级形式的【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】组件标签时,才使用。我们通过三个演示来说【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】明。
原创内容,盗版必究。转载请注明出处:www.tangshua【原创内容,转载请注明出处】【原创内容,转载请注明出处】ng.net【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。【本文受版权保护】ang.net【未经授权禁止转载】三种不同的调用演示
我们创建test的router、cont本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】roller、template,以及创建【未经授权禁止转载】【未经授权禁止转载】一个post-info组件。然后,我们在未经授权,禁止复制转载。【原创内容,转载请注明出处】app/controllers/test【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】.js中写入如下代码:
【作者:唐霜】【本文受版权保护】本文版权归作者所有,未经授权不得转载。import Ember from 'ember';
export default Ember.Controller.extend({
title : 'title name',
body : 'this is my test body',
author : 'Author'
postData : {
title : 'the title in sub',
body : 'body not the large',
author : 'contributor'
}
});
这里我们准备好了预设数据,将会在模板、组【版权所有,侵权必究】未经授权,禁止复制转载。件模板中进行调用作为演示。
【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshu【原创不易,请尊重版权】原创内容,盗版必究。ang.net1 直接调用controller中的数据
我们先使用yield直接输出,在app/【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】templates/components【转载请注明来源】原创内容,盗版必究。/post-info.hbs中加入如下代【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】码:
本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshua著作权归作者所有,禁止商业用途转载。【本文受版权保护】ng.net【原创不易,请尊重版权】未经授权,禁止复制转载。{{yield}}
就这样一个短短的代码就可以了。接下来在a本文作者:唐霜,转载请注明出处。【作者:唐霜】pp/templates/test.hb原创内容,盗版必究。【作者:唐霜】s中如下写入:
【未经授权禁止转载】未经授权,禁止复制转载。转载请注明出处:www.tangshua【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ng.net<h1>TEST</h1>
{{#post-info}}
<article>
<h2>{{title}}</h2>
<p>{{body}}</p></article>
{{/post-info}}
然后我们运行ember,可以看到,{{p本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ost-info}}区块的内容被展示出来【作者:唐霜】【原创不易,请尊重版权】。而且区块内容中的{{title}}{{原创内容,盗版必究。【本文受版权保护】body}}均使用controller中转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。的数据。我们把post-info.hbs未经授权,禁止复制转载。【作者:唐霜】改为如下:
转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】【作者:唐霜】ng.net【关注微信公众号:wwwtangshua未经授权,禁止复制转载。【转载请注明来源】ngnet】本文版权归作者所有,未经授权不得转载。<div>before yield</div>
{{yield}}
<div>after yield</div>
运行之后,我们发现区块内容被放在{{yi【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。eld}}的位置。最终构造出来的HTML【转载请注明来源】转载请注明出处:www.tangshuang.net是:
【版权所有】唐霜 www.tangshu【转载请注明来源】本文版权归作者所有,未经授权不得转载。ang.net著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【版权所有,侵权必究】<h1>TEST</h1> <div>before yield</div> <article> <h2>title name</h2> <p>this is my test body</p> </article> <div>after yield</div>
由此我们得出结论:
本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshua【本文首发于唐霜的博客】【原创不易,请尊重版权】ngnet】【作者:唐霜】原创内容,盗版必究。原创内容,盗版必究。原创内容,盗版必究。
- 主模板中的区块内容将被放在组件模板的{{【版权所有】唐霜 www.tangshuang.net【转载请注明来源】yield}}位置(这一规则在下面的所有本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。情况中也有效)。
转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。ng.net【本文首发于唐霜的博客】- 在未做任何yield预设的情况下,区块中【版权所有】唐霜 www.tangshuang.net【转载请注明来源】的变量由主模板决定。
转载请注明出处:www.tangshua【作者:唐霜】【版权所有】唐霜 www.tangshuang.netng.net本文版权归作者所有,未经授权不得转载。
2 在yield中使用传入的数据
我们把post-info.hbs修改为:
【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshua本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。ngnet】【本文首发于唐霜的博客】{{yield post.title post.body}}
把test.hbs修改为:
【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】ang.net【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。【本文受版权保护】ang.net【作者:唐霜】本文作者:唐霜,转载请注明出处。<h1>TEST</h1>
{{#post-info post=postData as |title body|}}
<article>
<h2>{{title}}</h2>
<p>{{body}}</p>
</article>
{{/post-info}}
这个时候再看返回的结果,就会发现原本ti【本文首发于唐霜的博客】【转载请注明来源】tle和body发生了变化,变为我们在c【转载请注明来源】【关注微信公众号:wwwtangshuangnet】ontroller中给的postData原创内容,盗版必究。【作者:唐霜】的值。
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。这样看的效果并不明显,我们把test.h【转载请注明来源】【关注微信公众号:wwwtangshuangnet】bs改为:
著作权归作者所有,禁止商业用途转载。【本文受版权保护】【本文受版权保护】<h1>TEST</h1>
{{#post-info post=postData as |test1 test2|}}
<article>
<h2>{{test1}}</h2>
<p>{{test2}}</p>
</article>
{{/post-info}}
这个时候你就应该发现规律了,test1是本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。postData.title的值,tes【本文受版权保护】【转载请注明来源】t2是postData.body的值。我著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。们得出结论:
【本文受版权保护】本文作者:唐霜,转载请注明出处。【本文受版权保护】【作者:唐霜】【未经授权禁止转载】转载请注明出处:www.tangshua【原创内容,转载请注明出处】【原创不易,请尊重版权】ng.net{{yield param1 param著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。2 …}}中的param被作本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】为as |output1 output2转载请注明出处:www.tangshuang.net原创内容,盗版必究。 …|中的output。(注意,我们这里将postData通过p转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netost传入到了组件模板中,所以组件模板中【版权所有,侵权必究】原创内容,盗版必究。的post实际上是被传入的postDat著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】a的数据。)
【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netang.net本文版权归作者所有,未经授权不得转载。【本文受版权保护】
看了一下文档,这种声明还可以按照下面这种未经授权,禁止复制转载。原创内容,盗版必究。形式进行:
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【原创不易,请尊重版权】未经授权,禁止复制转载。{{#if hasBlock}} {{yield post.title}} {{yield post.body}} {{yield post.author}} {{else}} <h2>{{post.title}}</h2> <p class="author">Authored by {{post.author}}</p> <p>{{post.body}}</p> {{/if}}
使用多个{{yield}}其实等同于使用未经授权,禁止复制转载。【版权所有,侵权必究】一个{{yield}},它的变量顺序是一原创内容,盗版必究。【原创内容,转载请注明出处】样的。但是这种组件模板可以更好的根据主模【版权所有】唐霜 www.tangshuang.net【本文受版权保护】板中是否是以块级的形式调用。
【本文受版权保护】本文作者:唐霜,转载请注明出处。3 使用hash声明
我们接下来继续修改post-info.h本文版权归作者所有,未经授权不得转载。【作者:唐霜】bs为:
【版权所有,侵权必究】转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】ng.net{{yield (hash title='just title for fun' body='this body is for fun')}}
把test.hbs修改为:
【版权所有】唐霜 www.tangshu【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】ang.net【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。<h1>TEST</h1>
{{#post-info as |post|}}
<article>
<p>{{post.title}}</p>
<p>{{post.body}}</p>
</article>
{{/post-info}}
再来看下运行结果。发现主模板中的|pos转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。t|被代入到主模板中的区块内容中,成为一【本文首发于唐霜的博客】原创内容,盗版必究。个变量,而它还有title和body两个转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net属性,都能输出我们想要的值。
未经授权,禁止复制转载。【未经授权禁止转载】我们在来混合使用一下,把post-inf本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。o.hbs改为:
本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】未经授权,禁止复制转载。{{yield (hash title=post.title body=post.body) post.author}}
把test.hbs改为:
【未经授权禁止转载】本文作者:唐霜,转载请注明出处。<h1>TEST</h1>
{{#post-info post=postData as |post author|}}
<article>
<p>{{title}}</p>
<p><small>{{author}}</small></p>
<p>{{body}}</p>
</article>
<article>
<p>{{postData.title}}</p>
<p><small>{{postData.author}}</small></p>
<p>{{postData.body}}</p>
</article>
<article>
<p>{{post.title}}</p>
<p><small>{{author}}</small></p>
<p>{{post.body}}</p>
</article>
{{/post-info}}
运行查看结果,上面的三个article标【版权所有,侵权必究】【版权所有,侵权必究】签中,第一个article标签模拟使用c原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。ontroller中的值,第二个arti原创内容,盗版必究。【转载请注明来源】cle标签中模拟使用controller本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。中的postData的属性来进行调用,第【转载请注明来源】【版权所有】唐霜 www.tangshuang.net三个article则模拟使用as |po【未经授权禁止转载】【作者:唐霜】st author|中的变量。有一点需要注意,就是第一个article【转载请注明来源】【作者:唐霜】中的{{author}}实际上已经被as转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net后的author覆盖了,所以显示的时候不原创内容,盗版必究。原创内容,盗版必究。会是Author,而是contribut【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。or。
【版权所有,侵权必究】【关注微信公众号:wwwtangshua著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】ngnet】本文版权归作者所有,未经授权不得转载。而实际上,使用hash声明的时候,yie【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。ld的变量仍然遵循上面第2点中的规则,就著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。是yield后面传入多少个变量,在as后原创内容,盗版必究。原创内容,盗版必究。面就可以声明多少个变量,括号的作用是把这个括号当作一个变量来对待本文作者:唐霜,转载请注明出处。【本文受版权保护】,hash的作用是将括号所代表的变量添加【本文首发于唐霜的博客】【本文首发于唐霜的博客】属性。
【关注微信公众号:wwwtangshua【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ngnet】【版权所有】唐霜 www.tangshu【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ang.net【作者:唐霜】由此,我们得出这样的结论:
未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】转载请注明出处:www.tangshua【本文首发于唐霜的博客】【作者:唐霜】ng.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshu【本文受版权保护】未经授权,禁止复制转载。ang.netyield中可以使用hash对某个预定义本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。变量进行属性规则规定。
【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。
【关注微信公众号:wwwtangshua【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ngnet】原创内容,盗版必究。
遗留问题,是否能如下使用yield(带=转载请注明出处:www.tangshuang.net【作者:唐霜】赋值):
【本文受版权保护】【关注微信公众号:wwwtangshua【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。ngnet】{{yield post=post author='IamAuthor'}}
本文中的这个知识点涉及到一个“闭包”的概念,当然这里不是意义上的闭包,但是【本文首发于唐霜的博客】未经授权,禁止复制转载。了解闭包概念,在此处的理解上会容易一些。
【版权所有】唐霜 www.tangshu【作者:唐霜】本文版权归作者所有,未经授权不得转载。ang.net【访问 www.tangshuang.n原创内容,盗版必究。原创内容,盗版必究。et 获取更多精彩内容】未经授权,禁止复制转载。【原创不易,请尊重版权】在主模板和组件模板之间,存在相互传值的过未经授权,禁止复制转载。【原创内容,转载请注明出处】程,这也就改变了原来ember的模板变量原创内容,盗版必究。未经授权,禁止复制转载。值的来源,在原始的ember模板变量赋值【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。过程中,需要借助controllers或【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】组件来完成,也可以像行内调用的方式,实现本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。传值。但是当采用我们本文讨论的方法之后,转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net组件的模板中可以预先设定好一些值,反传给【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net主模板,这就突破了原始的ember模板变【转载请注明来源】本文作者:唐霜,转载请注明出处。量值的来源。
【原创不易,请尊重版权】【版权所有,侵权必究】2016-05-26 6604


