avalon2学习教程03数据填充

在avalon1中,存在四种数据填充的手段css

{{expr}}, {{expr|html}}, ms-text, ms-htmlhtml

其实第一种与第三种同样,用于输出纯文本,第二种与第四种同样,若是用户的数据是一些HTML标签,那么会转换成元素节点插入到当前位置。react

在avalon2中,只有三种数据填充的手段,原第二种使用html过滤器的方式因为在虚拟DOM很差实现,被移除。git

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="./dist/avalon.js"></script>
        <script>
            var vm1 = avalon.define({
                $id: "test",
                a: 111,
                b: 222
            })
        
        
        </script>
        <style>
            .ms-controller{
                display:none;
            }
        </style>
    </head>
    <body>
        <div ms-controller="test">
            <p><input ms-duplex="@a" />{{@a}}<strong ms-text="@a"></strong></p>
            <p><input ms-duplex="@b" /><span>{{@b}}</span><span ms-html="@b"></span></p>
        </div>
    </body>
</html>

图片描述

咱们按F12,看控制台的状况github

图片描述

可见ms-html的威力,但这是一个性能消耗比较严重的指令,像react,估计让相应的指令名设计得很长,不让人们用它:后端

var content='<strong>content</strong>';    
 
React.render(
    <div dangerouslySetInnerHTML={{__html: content}}></div>,
    document.body
);

这是由于HTML中,用户存在很大的自由,能够随意加onclick, src="data:text/html;base64,SGVsbG8sIFdvcmxkIQ%3D%3D",script标签,从而作各类破坏活动。所以avalon2也不建议人们大量使用它。网络

若是你必定要用,那最好使用sanitize过滤器进行XSS处理性能

<p ms-html="@html | sanitize"></p>

此外值得注意的是,固然咱们将插值表达式{{}}应用于网站首屏时,有时因为网络慢的缘故,会出大量的乱码现象(就是{{@b}}让用户看到了),这时咱们有两个办法。网站

第一个方法,添加ms-controller类名,将当前区域先隐藏起来,avalon扫描到这里后会自动隐藏它们的。spa

.ms-controller{
     display:none;
 }

注意这样式必须写head的上方,方便它第一时间被应用。

第二个方法,使用ms-text代替{{}},这个最省心最有效,比第一个效果好。

数据填充是传统静态模板的最基础功能。所以你在混用avalon与其余后端模板时,会出现冲突,你们都使用 {{}}作界定符。这时咱们可使用如下方式配置界定符,注意,这个脚本也在放在head前面,或保证你在扫描前运行它。

avalon.config({
   interpolate:["{%","%}"]
})

此时,咱们能够经过avalon.config.openTag, avalon.config.closeTag获得“{%”,"%}"。注意,界定符里面千万别出现<, >,由于这存在兼容性问题。这两个界定符也不能同样,最好它们的长度都大于1。

相关文章
相关标签/搜索