[关闭]
@Wahson 2017-05-08T23:04:07.000000Z 字数 1399 阅读 1159

Polymer 2.0 Template-Expression 特性

前端技术


需求依然非常简单,实现一个跟Vue.js差不多的框架就行。

那么既然这样,还是先看一个Polymer的痛点:

  1. <div>{{ parseNum(floatNum) }}</div>
  2. <div>{{ reverseStr(str) }}</div>
  1. class XElem extends Polymer.Element {
  2. ...
  3. static get properties(){
  4. return {
  5. floatNum:{
  6. type:Number,
  7. value:"10.001"
  8. },
  9. str:{
  10. type:String,
  11. value:"abcedfg"
  12. },
  13. total:{
  14. type:Number,
  15. value:666
  16. }
  17. };
  18. }
  19. parseNum(num){
  20. return parseInt(num);
  21. }
  22. reverseStr(str){
  23. return str.split('').reverse().join('');
  24. }
  25. }

以上代码实现的功能非常简单,把一个浮点数转成整数显示在页面上,另外把一个字符串逆序后显示。上面是Polymer典型的实现,这里我们要为每一个需要处理的属性(floatNum,str)分别定义处理方法(parseNum,reverseStr),即便是非常简单的操作。经验告诉我们,大部分这些处理方法定义后只使用一次。于是日复一日编写这样啰嗦繁琐的代码后,程序员的哀怨之声开始宁饶在办公室的上空。

于是我们有了Template-Expression的需求(Vue.js有的,Polymer大法也得有啊)
先来看一下Template-Expression 2.0特性的用法:

  1. <div>{{{ parseInt(floatNum) }}}</div>
  2. <div>{{{ str.split('').reverse().join('') }}}</div>
  3. <div>{{{ floatNum + floatNum + 1 }}}</div>

用法非常简单:

{{{ doSthWith(propertyName) }}}

原理解析:
其实这个用法不过是一个语法糖。我们以{{{ parseInt(floatNum) }}}这个表达式为例来浅谈一下这个sugar。
其实这个语法糖逆转过来,完全等同于以下写法

  1. <div>{{ tmplFn_1494252916934_9013(total) }}</div>
  2. class XElem extends Polymer.Element {
  3. ...
  4. tmplFn_1494252916934_9013(_var1494254257038_395_) {
  5. return parseInt(_var1494254257038_395_);
  6. }
  7. }

表达式会被重新解析,里面的属性变量(total)会被重命名(_var1494254257038_395_),而后表达式会作为一个新函数(tmplFn_1494252916934_9013)的返回结果,接着这个新的函数会被添加到XElem的prototype原型上。当然,还会对total进行双向绑定。

Template-Expression特性相关代码:
https://github.com/mrLeung/polymer/commit/8b9ea2380b29184535943352d2a0e5abab6fbbda
核心代码函数_parseTemplateExpression

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注