在写hst-virtual-dom的时候转载请注明出处:www.tangshuang.net【转载请注明来源】,由于没有能力自己写一个语法解析器,仍然【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net使用了内部是eval的Function来【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。解析插值。在查看了angular的$pa【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。rse源码之后,发现angular自己实著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。现了一套ast来解析js字符串脚本,于是转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】觉得这可能是我一直在寻找的东西。经过Go【转载请注明来源】原创内容,盗版必究。ogle之后,发现有一个叫angular-expressions【版权所有,侵权必究】的库将这个模块从angular中剥离出来【本文受版权保护】原创内容,盗版必究。,成为一个独立的模块,可以在node环境【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net中运行,于是决定研究一下这个库。
【本文首发于唐霜的博客】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】【本文首发于唐霜的博客】打开parse.js这个文件,我天,竟然【未经授权禁止转载】【原创不易,请尊重版权】有4000多行代码,肯定是不可能看了。最本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net后决定,只研究它外层的封装,而不深入它的未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。内层去研究,只要用它就可以了。
【版权所有,侵权必究】原创内容,盗版必究。【版权所有,侵权必究】未经授权,禁止复制转载。angular解析执行器用法著作权归作者所有,禁止商业用途转载。
【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net先来看下angular里面怎么使用$pa【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】rse:
【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【本文首发于唐霜的博客】【作者:唐霜】let parser = $parse('project.name')
let value = parser($scope)
上面实际上得到的结果是【访问 www.tangshuang.net 获取更多精彩内容】$scope.project.name,但是为什么要用$parse去执行,而不【版权所有,侵权必究】【转载请注明来源】直接调用呢?这是因为这个project.【转载请注明来源】【本文受版权保护】name可能是一个directive的a转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netttr传进来的。举个例子:
<div my-directive="members[2].name"></div>
然后你要在my-directive的代码【转载请注明来源】【原创不易,请尊重版权】里面去使用字符串的形式获取。你得到一个字转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。符串members[2].name,怎么通过这个字符串,从$scope上获【作者:唐霜】转载请注明出处:www.tangshuang.net取你想要的东西呢?这个时候就得靠$par转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netse。
安全的eval本文作者:唐霜,转载请注明出处。
【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【转载请注明来源】JavaScript里面虽然有一个eva原创内容,盗版必究。本文作者:唐霜,转载请注明出处。l可以用来把字符串作为脚本进行运行,但是【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。它被认为是不安全的。为了能够解析并运行字【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。符串,不同的框架都做了尝试,而无疑,an【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】gular是里面都佼佼者。基于angul【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】ar的$parse而生的angular-转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】expressions把这个功能从ang【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ular里面提取出来,你可以这样去使用它【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net:
【作者:唐霜】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。var expressions = require("angular-expressions");
var parse = function(str){
return expressions.compile(str)();
}
console.log(parse('1 + 1')); // 2
console.log(parse('1 ? 1 : 0'))
这是一个简单的执行器,可以用来执行简单的本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.netjs表达式并得到结果。
本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【作者:唐霜】NOT eval【原创内容,转载请注明出处】
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net原创内容,盗版必究。【作者:唐霜】但它和eval的表现形式完全不同,eva【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。l里面是一个完整的js上下文环境,最直接【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。的体现就是this。如果在执行eval之【作者:唐霜】【版权所有,侵权必究】前this就是有所指向的,那么eval里【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。面的this和前面这个this是一样的指【本文受版权保护】本文作者:唐霜,转载请注明出处。向。但是我们这里的parse完全不同,它【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。要求有一个作用域,在未传作用域的情况下,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。里面的任何变量都是undefined,而本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】在传了作用域之后,里面的变量将作为作用域转载请注明出处:www.tangshuang.net【未经授权禁止转载】对象的属性进行查询,这和angular的本文作者:唐霜,转载请注明出处。【转载请注明来源】模板里面的变量名与$scope之间的关系原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】是一样的。因此,我们要在parse里面使【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】用变量,就必须传一个scope,我们将代【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】码改造为:
【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【原创不易,请尊重版权】var expressions = require("angular-expressions");
var parse = function(str, scope){
return expressions.compile(str)(scope);
}
于是,我们就可以在传了scope的情况下【本文受版权保护】【原创内容,转载请注明出处】,在str里面写一些变量:
原创内容,盗版必究。【未经授权禁止转载】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】var value = parse('age + 12', { age: 3 }) // 15
甚至,我们还可以在str里面对scope著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。不存在的属性赋值:
【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【作者:唐霜】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。var obj = {}
parse('sub.name = "mabo"', obj)
console.log(obj.sub.name) // mabo
这可真是神奇的操作。【版权所有】唐霜 www.tangshuang.net
本文版权归作者所有,未经授权不得转载。【作者:唐霜】著作权归作者所有,禁止商业用途转载。插值的好帮手【原创不易,请尊重版权】
转载请注明出处:www.tangshuang.net【本文受版权保护】原创内容,盗版必究。【未经授权禁止转载】有了这样的操作,我们就很容易将它运用到模【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。板引擎的插值运算中了。例如我们可以仿造v未经授权,禁止复制转载。【版权所有,侵权必究】uejs的插值方式进行逻辑处理:
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】<button @click="onClick">xx</button>
{
methods: {
onClick() { alert('ok') }
}
}
我们怎样才能将模版中的onClick正确未经授权,禁止复制转载。【本文受版权保护】解析为methods.onClick呢?【作者:唐霜】【未经授权禁止转载】因为vue已经做了一道工序,也就是thi本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】s.onClick = methods.原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。onClick,而且onClick里面的【本文受版权保护】【作者:唐霜】this还指向了vue实例。所以在模板解【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】析完成之后,我们得到一个virtual 【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】dom并且规矩规则对这个button的c【未经授权禁止转载】未经授权,禁止复制转载。lick事件进行绑定:
原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【转载请注明来源】buttonElement.addEventListener('click', (e) => {
let scope = {
$this: this,
$event: e,
}
let onClick = parse('$this.' + attrs.bind.click, scope) // attrs.bind.click就是指@click的值
if (typeof onClick === 'function') {
onClick.call(this, e)
}
}, false)
这段代码一上,你甚至可以在模板中写@cl本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。ick=”onClick($著作权归作者所有,禁止商业用途转载。【作者:唐霜】event)”。至于类似于{{text}}这样的插值,完全不在话下。【转载请注明来源】
ToeX【本文首发于唐霜的博客】
【本文受版权保护】【未经授权禁止转载】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。基于上面的思想,我自己写了一个packa【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ge,取名ToeX,实现了对angula【作者:唐霜】未经授权,禁止复制转载。r-expressions的封装,使得a【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netpi更加方便实用。我已经发布到githu【关注微信公众号:wwwtangshuangnet】【作者:唐霜】b,你可以在这里【未经授权禁止转载】看到源码。看下它的简单实用:原创内容,盗版必究。
【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netvar ToeX = require('toex')
var toex = new ToeX($scope)
// 过滤器
toex.filter('double', value => value * 2)
// 求值
var normalExpressionResult = toex.parse('1 + 1 | double') // 这里演示了使用过滤器
var scopeExpressionResult = toex.parse('key + 1')
// 赋值
toex.assign('name', 'tomy')
它一共3个api,使用超级简单,可以考虑【未经授权禁止转载】【原创内容,转载请注明出处】用到任何需要的地方。
【本文受版权保护】【本文受版权保护】本文版权归作者所有,未经授权不得转载。小结【本文受版权保护】
【原创内容,转载请注明出处】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。好了,本文主要介绍了一个基于angula未经授权,禁止复制转载。【转载请注明来源】r.$parse服务的一个库,并且基于它【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】,做了一些扩展的想法。当我们在有需求的时【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】候,可能会用上这个库。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】本文版权归作者所有,未经授权不得转载。

