Thinkphp中JS如何获取模板变量(示例详解)

 5206

下面给大家介绍PHP框架中JS优雅获取模板变量的方式,希望对需要的朋友有所帮助!

PHP框架中JS优雅获取模板变量的方式

在使用PHP框架(本文以ThinkPHP为例)进行页面开发的时候,经常遇到需要将控制器方法中的模板变量代入到页面JS内操作的情况,常见的方式如:

  1. let admin={:json_encode($admin)},  //$admin是php数组
  2.     level={$level};  
  3. console.log(admin, level);

这种方式确实是可以取到值的,只是存在几个问题

模板变量的语法放在js中,编辑器会报语法错误

当采用编辑器的自动格式化功能时,模板变量的声明结构会被破坏,从而影响了自动格式化代码功能的使用

不够美观

在实践中比较推荐的方式是:将模板变量存到特定的节点中,然后由全局方法将其转成全局的变量,最后需要用到这些变量的方法再读取这些全局变量。下面以一个完整的模板为例:

  1. <!DOCTYPE html>  
  2. <html lang ="en">  
  3. <head>  
  4.  <meta charset="UTF-8">  
  5.  <title>PHP框架中JS优雅获取模板变量的方式</title>  
  6.  <style>  
  7.  /* 通用的模板数据存放标签,视觉不可见 */ 
  8.  .data-box {  
  9.       display: none;  
  10.   }  
  11.  </style>  
  12. </head>  
  13. <body>  
  14. <!-- 页面内容 -->  
  15. <h2>Hi,结果请看console</h2>
  16.    
  17. <!-- 数据存储节点,可以同时存在多个data属性 -->  
  18. <!-- 如果模板变量是数组,须先转成json字符串(如$admin) -->  
  19. <div class="data-box" data-admin='{:json_encode($admin)}' data-level='{$level}'></div>  
  20.    
  21.    
  22. <script>  
  23.   /* 获取数据的操作 */ 
  24.    
  25.  /* 初始化页面渲染时传过来的js变量 */ 
  26.  let dataContainerElem = document.querySelector('.data-box'),  
  27.      data = dataContainerElem ? dataContainerElem.dataset : {},  
  28.      dataBox = {}; //模板变量容器,`.data-box`类选择器所在的所有`data`属性值集合  
  29.    
  30.   Object.keys(data).forEach(function (key) {  
  31.       dataBox[key] = data[key];  
  32.       if (isJsonString(data[key])) dataBox[key] = JSON.parse(data[key]); //是json格式的字串才转对象  
  33.   });  
  34.    
  35.  /**  
  36.   * 判断字串是否属于json字串  
  37.   */ 
  38.  function isJsonString(str) {  
  39.      let flag = false;  
  40.    
  41.      if (typeof str != 'string') return flag;  
  42.    
  43.      try {  
  44.          JSON.parse(str);  
  45.          flag = true;  
  46.      } catch (e) {}  
  47.    
  48.      return flag;  
  49.   }  
  50. </script>  
  51.    
  52. <script>  
  53.   /* 使用数据 */ 
  54.  //所有保存到数据节点的变量都成为`dataBox`对象的属性  
  55.   console.log(dataBox.admin, dataBox.level);  
  56. </script>  
  57. </body>  
  58. </html>

实际开发中,我会将这里的css和获取数据的js操作放置在全局的母模板中,然后具体的子模板只要继承了母模板就可以使用该功能,方便代码的复用。


本文网址:https://www.zztuku.com/detail-9589.html
站长图库 - Thinkphp中JS如何获取模板变量(示例详解)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    建筑监理公司网站模板