美文网首页
Eng API (中文)

Eng API (中文)

作者: KS_KS | 来源:发表于2017-08-05 20:03 被阅读0次

在线测试地址

gitHub 文件地址

特别声明:

Eng 数据中 $_ 是 Eng的数据专属命名域,请勿以 $_ 开头命名数据
目前放出的是Eng的 0.8 beta版,
即将补充支持的 特性 或 方法 ,将在APi 结尾 版本前瞻中说明

API

基本案例

示例

html:
   <div id="app">
      <p>{{value}}</p>
   </div>   
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{ 
                    value:'Hello Eng'
                  }
  });
输出:
  <div id="app">
       <p>Hello Eng</p>
  </div>



e-base

html:
  <div id="app">
              <div e-base='base1'>
                  <p>{{value}}</p>
                  <div e-base='base2'>
                     <p>{{value}}</p>
                  </div>
              </div>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{
                  base1:{
                        value:'我是基于 base1 的value值',
                        base2:{
                              value:'我是基于 base2 的value值'
                              }
                        }   
                 }
  });
输出:
  <div id="app">
                <div>
                  <p>我是基于 base1 的value值</p>
                  <div>
                     <p>我是基于 base2 的value值</p>
                  </div>
               </div>
   </div>
注意:
#CN:
#   e-base=baseName指令所在标签下所有子元素的值, 都是基于当前 baseName,
#   {{baseName.value}} 这种写法是在Eng 中任何地方都是非法且不允许的, 今后也永远
#   不会支持.
#   作者认为这是散漫又不严谨的数据结构设计行为.不符合Eng '惯性逻辑思维' 的思想
#   (数据结构 与 dom树结构 完全匹配 )



e-attr

html:
  <div id="app">
       <div e-attr='class=v0'> ...
       </div>
       <div e-attr='class=v1?(css0):(css1)'> ... 
       </div>
       <div e-attr='class=v2>=10?(css0):(css1)'> ...
       </div>
       <div e-attr='class=v0;tittle=v3;atr=v2>=10?(css0):(css1)'>  ...
       </div>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{
                  v0:'css',
                  v1:true,
                  v2:9,
                  v3:'this is tittle'   
                 }
  });
输出:
 <div id="app">
       <div class='css'> ...
       </div>
       <div class='css0'> ...
       </div>
       <div class='css1'> ...
       </div>
       <div class='css' tittle='this is tittle' atr='css1'> ...
       </div>
  </div>

.......

注意:
#CN:
#   e-attr 指令支持多个表达式
#   当前版本中 ( ) 外不能有多余的 空格
#   当前版本中 ( ) 内不能有其它 分号 ';'



e-html

html:
  <div id="app">
       <div e-html='v'>
       </div>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{ 
                 v:'<p>DOM 文本</p>'
                 }
  });
输出:
  <div id="app">
       <div>
          <p>DOM 文本</p>
       </div>
  </div>

.......

注意:
#CN
#  e-html 指令下的子元素, 如包含有其它指令, 都不会被执行



e-id

html:
  <div id="app">
      <button e-id='idName' >Click</button>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{},
             created:function(eng){
                    //idName = idName
                    eng.idName.onclick=function(){
                     alert('click');
                   };
             }    
  });
说明:
#CN:
#   e-id 指令不支持在e-for 循环内 ,以及 $_setToSelf() 和 $_setToGlobal() 中使用;
#   e-id=name  ,  name命名唯一



e-for

html:
  <div id="app">
       <div>
          <p e-for='for1'>
             index = {{$_index}} value= {{$_value}}
          </p>
       </div>
       <eng>
           <p e-for='for2'>
             index = {{$_index}} .... {{v}}
           </p>
       </eng>
       <eng>
           <div e-for='for3'>
                {{v}}
                <div e-for='for4' style='margin-left: 30px'>
                    {{v}}
                </div>
           </div>
       </eng>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{ 
                  for1:['a','b'],
                  for2:[
                        {v:'a'},
                        {v:'b'},
                       ],
                  for3:[
                        {
                         v:"I'm for3 0",
                         for4:[
                               {v:"I'm for4 0"},
                               {v:"I'm for4 1"}
                              ]
                        },
                        {
                         v:"I'm for3 1",
                         for4:[
                               {v:"I'm for4 2"},
                               {v:"I'm for4 3"}
                             ]
                        },
                       ]     
                 }
  });
输出:
  <div id="app">
       <div>
          <p> index = 0 value = a </p>
          <p> index = 1 value = b </p>
       </div>
       <eng>
           <p> index = 0 .... a </p>
           <p> index = 1 .... b </p>
       </eng>
       <eng>
           <div>
              I'm for3 0
              <div> I'm for4 0 </div>
              <div> I'm for4 1 </div>
           <div>
           <div>
              I'm for3 1
              <div> I'm for4 2 </div>
              <div> I'm for4 3 </div>
           <div>
       </eng>
  </div>
注意:
#CN
#    Eng 为适应动态的 DOM 变化交互场景, 所有for元素都依赖其父元素进行定位, 
#    在没有确定的父标签,又需要确定的填充位置时,建议统一使用 <eng>  </eng>做为
#    父标签包裹  ,  同理也可以作为e-base的base父元素
#    e-for=name , 如果要使用 watcherFor:{} 过滤器的话, 为了快速定位for对象
#    'name' 的命名在所有 for 对象中必须具有 唯一性 ;不打算使用过滤器,则所有合
#    法的命名均适用 



el 选项 补充说明

js:
   var domStr="<p>{{v}}</p>";

   var app=new Eng({
             el:domStr,
             data:{ 
                   v:'我还支持 dom 文本数据模板'
                },
             created:function(eng){
                document.body.appendChild( eng.$_el );
             }
  });
输出:
     <p>我还支持 dom 文本数据模板</p>
注意:
#CN
#    el 既支持 dom节点 也支持 dom文本, 生成的dom对象 在 created() 内,
#    以 eng.$_el 返回



watcher:{ .... } 选项方法

html:
  <div id="app">
       <p>{{v1}}</p>
      <div e-base='base'>
            <p>{{v2}}</p>
      </div>
  </div>
js:
   var app=new Eng({
             el:document.getElementById('app'),
             data:{ 
                  v1:123,
                  base:{
                       v2:456
                       }
                },
             watcher:{
                  'v1':function(oldValue,newValue,eng){
                         if(newValue==123){
                          eng.$_value='v1 的值 ,被修改了';
                         }
                       },
                   'base.v2':function(oldValue,newValue,eng){
                        if(newValue==456){
                          eng.$_value='base.v2 的值 ,被修改了';
                         }
                   }       
             }
  });
输出:
 <div id="app">
       <p> v1 的值 ,被修改了</p>
      <div>
          <p> base.v2 的值 ,被修改了</p>
      </div>
  </div>
注意:
#CN
#    eng.$_value              //修改输出的值 
#    eng.$_destroy=true;      //销毁该 watcher 对象



watcherFor:{ .... } 选项方法

html:
  <div id="app">
        <eng>
           <p e-for='for1'>
             index = {{$_index}}   value = {{$_value}}
           </p>
        </eng>
        <hr>
        <eng>
           <p e-for='for2'>
             index = {{$_index}}   value = {{v}}
           </p>
        </eng>
  </div>
js:
  var app=new Eng({
             el:document.getElementById('app'),
             data:{ 
                 for1:[0,1,2,3,4,5],
                 for2:[
                       {v:0}, {v:1}, {v:2}, {v:3}, {v:4}, {v:5}
                      ]
            },
            watcherFor:{
                     for1:function(eng){
                            if(eng.$_data % 2 == 0){
                               eng.$_allow=false;
                            };
                     },
                     for2:function(eng){
                            if(eng.$_data.v % 2 == 1){
                               eng.$_allow=false;
                            };
                     },
            },
            created:function(eng){
                
                  // eng.$_watcherFor({
                  //         for1:null   //用于销毁已注册的  过滤器 
                  // });
                   
            }
  });
输出:
 <div id="app">
        <eng>
           <p> index = 0   value = 1  </p>
           <p> index = 1   value = 3  </p>
           <p> index = 2   value = 5  </p>
        </eng>
        <eng>
           <p> index = 0   value = 0  </p>
           <p> index = 1   value = 2  </p>
           <p> index = 2   value = 4  </p>
        </eng>
  </div>
注意:
#CN
#    之前提到过如果要使用该过滤器 ,为了快速定位for对象 ,for 对象 的命名必须具有唯一性.
#    eng.$_watcherFor( {  for1:null } )   用于销毁已注册的过滤器



以下全被为

created : function( eng )    选项方法内 eng 参数使用说明示例

var app=new Eng({
             el:...,
             data:...,
             created:function(eng){
                eng.$_data;         // 等于 app
                eng.idName;        //e-id
                eng.$_watcher();   //等同于watcher
                eng.$_watcherFor();//等同于watcherFor
                eng.$_setToSelf();
                }
             });
                

eng.$_watcher(...)

js:
   var app=new Eng({
             el:...,
             data:{
                 v:...
             },
             created:function(eng){
                 eng.$_watcher({
                                'v':function(oldValue,newValue,eng){
                                       .....
                                    }
                              })
             }
  });
说明:
#CN
#    eng.$_watcher() 用法等同于 watcher  ,修改数据时生效

eng.$_watchFor(...)

js:
   var app=new Eng({
             el:...,
             data:{
                 v:...
             },
             created:function(eng){
                              eng.$_watcherFor({
                                    'forNames':function(eng){
                                            ....
                                            }
                              })
             }
  });
说明:
#CN
#    eng.$_watcherFor() 用法等同于 watcherFor , 修改数据时生效

eng.$_setToSelf(...)

js:
   var app=new Eng({
             el:null,
             data:{},
             created:function(eng){
                     var data={ 
                               v : "I'm one-time"
                              };
                     var domOrStr= "<p e-attr='title={{v}}'> {{v}} </p>";
                     var dom=eng.$_setToSelf(data,domOrStr);

                         document.body.appendChild(dom);     
             }
  });
  console.log(app.v);
输出:
   <p title="I'm one-time">
       I'm one-time
   </p>
说明:
#CN
#    data: 合法的json数据
#    domOrStr: dom 节点或文本 ,  不支持写入e-id 和e-for 指令,其它均支持
#    生成的数据是一次性的, 不支持数据绑定

eng.$_setToGlobal(...)

js:
   var app=new Eng({
             el:null,
             data:{},
             created:function(eng){
                     var data={
                                v:"I'm not one-time"
                               };
                     var domOrStr = "<p e-attr='title={{v}}'> {{v}} </p>";
                     var dom=eng.$_setToGlobal({
                                             el:domOrStr,
                                             key:'base',
                                             data:data,
                                             base:'',
                                    });
                         document.body.appendChild(dom);     
             }
  });
  console.log(app.base.v);
输出:
   <p title="I'm not one-time">
       I'm not one-time
   </p>
说明:
#CN:
#    el:   dom 节点或文本 ,     暂不支持写入e-id 和e-for 指令,其它均支持;
#    data: 合法的json 对象
#    key:  data的 key 值命名
#    base: 数据存储的位置 ,忽略 则 添加到数据 的根目录 
#    已上三者的关系 等价于:   app.base.key=data; 
#    支持数据绑定

版本前瞻:

#CN:
#    1.后续,将会提供一个sever端的插件,支持将dom文本压缩成 Eng 可以识别的json对象,
#      减少网络数据传输,Eng中的所有el选项都将支持该json对象 ,加速dom和数据的首次
#      生成渲染效率
#    2.将 支持 '组件自行为', 允许单独在页面内定义组件对象, Eng 会向服务端 请求该对
#      象的所有素材,生成完整的组件..
#    3.$_setToGlobal()和 $_setToSelf 将有可能将支持 写入e-id 和e-for 指令,如果有
#      必要的话 
#    4.将 支持数据分页
#    5.将 支持数据 撤销 重做操作, 允许记录一定步数的数据操作
#    6.将 支持 数据比对,仅提交已修改的数据,减少服务器端重复计算(有必要的话)
#    7.下个版本有可能兑现已上大部分功能
#    8.Eng 的本地端体积,最终将会控制在 20kb左右或以内


关于Eng:

    Eng 取自 engine 的缩写,寓意可以向 引擎 一样快而简的将 '数据结构' 与 'dom结构' 
    紧密的契合驱动,以 '惯性思维' 的方式,在大多数场景下化繁就简的处理数据及dom交
    互.

    Eng 是组件化的解决方案,  目前仅有 11kb ,只有5个基本指令,5个 选项方法,就可以实
    现 angular, vue 和 react等, 前端工具常用功能
    
    Eng 拥有不逊色于所有同类软件的优异性能,以及最低的学习曲线.

Eng的由来:

   作者主要从事js交互及特效编写,心得认为:大部分插件的编写,如果能够基于其使用环境
   的内在逻辑规律,并设计相应的 逻辑和dom 结构,将会极大的简化编写 复杂程度 和 使用
   难度..

   作者偶然在同事那里接触并粗浅了解一下相关的工具,认为它们在用一种复杂的思想或策略,
   去解决一件简单的事情.

   待解决事物的 逻辑上的复杂是'客观'存在的, 但解决方案的复杂程度是'主观'上的. 

   作者厌恶一切主观上的复杂,认为有更简洁的 ' 惯性思维' 解决方案, 并乐于 '造轮子'.

   这就是Eng的由来 , 所以Eng的出现与angular vue 和 react等工具 的本质区别是对前端
   世界理解的思想方式不同

Eng的思想:

   Eng的'惯性思维' 思想是基于使用环境的内在规律, 形成习惯性的处理方式,忽略生产工具
   的复杂,将重点放在解决事物的'客观'复杂上;

   Eng中所有的行为均围绕着一个 基础/base ,这也是页面 dom 树的结构规律, Eng 完全遵
   守dom渲染逻辑规则;

   Eng中只有5个基本指令和5个选项方法,未来可能会有所补充,但不会是核心或需要特别学习
   的;

   Eng中数据结构与dom分级结构完全匹配 , (数据中,所有Array和json对象的key值 ,皆为
   base);

   Eng的'惯性思维'基于严格规律逻辑,也就是后续所有升级新特性的支持,将会one-take.不会
   出现全家桶等额外插件,仅会有本地端 和 服务端两个主文件

相关文章

网友评论

      本文标题:Eng API (中文)

      本文链接:https://www.haomeiwen.com/subject/wctwlxtx.html