vue+freemarker中遇到的坑及解决

目录
  • vue+freemarker遇到的坑
    • 在这个过程中遇到了几个坑
  • freemarker的一些坑问题
    • 1.对空对象十分敏感
    • 2.freemarker中的${}与js中的${}冲突
    • 3.渲染数字时出现逗号分隔
    • 4.拼接渲染
    • 5.将对象或数组渲染进js

vue+freemarker遇到的坑

java后端开发者做后台管理系统,用模版技术还是挺方便的,但是如果在页面上对数据进行修改,怎么办呢?

可以用jQuery选中各个dom节点的值,然后组装成后台接口中需要的Form,再用ajax请求后台,这种方式的缺点在于,如果数据字段比较多,需要手动选择很多个dom节点,再取值,想想都可怕。

由于笔者之前做过AngularJS的项目,知道了数据的双向绑定,现在很火的Vue.js也是跟AngularJS差不多,支持双向绑定。但是不想用前后端分离,搞两套部署,主要是对前端部署那些也不熟悉。

那笔者就想在模版页面中引入Vue.js的双向绑定功能,这样就不用再用jQuery去选择dom节点了。

大概思路浏览器请求Controller,返回一个视图,这个视图就是freemarker模版,在模版中引入Vue.js,将页面上需要提交的数据绑定到Vue的对象中的数据上,然后在创建或更新的时候直接用ajax请求把这个Vue对象中的数据传给后端。

在这个过程中遇到了几个坑

1.通过jquery修改vue绑定的model值(v-model),vue取不到这个值。

如freemarker模版中有<img :src=“pic_url”/>,在用户上传图片后,通过jquery更改img的src属性为图片地址之后,通过vue的对象中的data中的pic_url是取不到这个值的。

查了网上说,vue一般都只监听用户在页面上的操作事件,jquery修改的事件不能够被vue监听到,可以在jquery修改后dispatch一个event给vue监听,笔者为了省事,在vue对象中methods中的方法中,把需要用jquery改变的地方,还是用jquery取到之后再赋值给vue对象中的数据属性上。

2.freemarker模版片段中引用了<script></script>,在script中有new Vue的操作,结果到浏览器页面报错:

templates should only be responsible for mapping the state to the ui. avoid placing tags with side-effects in your templates, such as <script>, as they will not be parsed.

后来上网查了一下,在script中加上了type就好了:

<script type=“application/javascript”>

可以参考https://stackoverflow.com/questions/38119088/error-templates-should-only-be-responsible-for-mapping-the-state-to-the-ui-avo

3.freemarker模版中的input value明明是有值的,到浏览器中页面上却不显示。

原因是因为这个input被vue的model绑定了,到浏览器中vue把数据清空了,虽然在开发者工具中仍可以看到input的value属性是有值的,但是页面是不显示的,vue的对象中data中也没有值。

正确的做法应该是在freemarker中,把值赋给vue的对象,而不是赋值给dom上的input节点的value:

    var modifyVm = new Vue({
        el: '#myModifyModalContent',
        data: {
            myForm: {
            //这儿把freemarker模版中的初始值赋值给vue对象的data中属性
            //然后freemarker中写成
            //<input type="text" v-model="myForm.name" placeholder="请输入城市名称"/>
            //这样就可以了。
                name: "${oldCityInfo.name!''}",
                //标签
                labels: '',
            }
        },
        ...
    )

freemarker的一些坑问题

1.对空对象十分敏感

freemarker对空值敏感,当我们的值为空时,会抛出异常。

解决办法是:

1.${item!''} 当item为null时渲染为空字符串,不为空则渲染自身值。

2.${item??}结合freemarker的条件标签。

<#if item??>
    true:item值不为空
<#else>
    false:item值为null
</#if>

值得注意的是在freemarker自身的标签中,是不需要${}的

2.freemarker中的${}与js中的${}冲突

在外面包裹上${r"..."}

${r"${person.name}"} 输出js语句 ${person.name},如果没有包裹的话,js会被渲染。

3.渲染数字时出现逗号分隔

渲染数字时freemarker 会自动每隔3位进行逗号分隔,使用${id?c}就不会了。

4.拼接渲染

${}内是可以做计算的,也可以字符串拼接。如:${a+1},${str1+str2}。需要注意的是,如果内部复合了其他方法,需要加上小括号。如${str1+(str2!'')}

5.将对象或数组渲染进js

因为${}渲染的都是静态的字符串,如果想要js获取到对象或数组,需要配合js自身的数组push方法结合渲染对象最小的单位形成一个插入方法(最小的单位不能是对象或数组,最小单位是字符串或数字等),

例如一个

        dbLinkData数组里面是多个
         {
            groupName: 'XXX',
            linkInfo: arr2
         } 对象
         而 arr2 又是一个数组内部是多个
         {
            name:'XXX',
            url:'XXX'
          } 对象

解决方法如下:

     var listMember = "${dbLinkData?size}";
        var arr1 = [];
        if (listMember != 0) {
          <#list dbLinkData as item >
            var arr2=[];
            <#list item.linkInfo as items >
            arr2.push({
              name:'${items.name}',
            url:'${items.url}'
          })
          </#list>
          arr1.push({
            groupName: '${item.groupName}',
            linkInfo: arr2
          })
        </#list >
        }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • VUE预渲染及遇到的坑

    本文介绍了VUE预渲染及遇到的坑,分享给大家,具体如下: npm install -D prerender-spa-plugin 修改webpack.prod.conf.js,在CopyWebpackPlugin后面,增加内容. var PrerenderSpaPlugin = require('prerender-spa-plugin') new PrerenderSpaPlugin( //将渲染的文件放到dist目录下 path.join(__dirname, '../dist'), //需

  • vue项目热更新的坑及解决

    目录 vue项目热更新坑 vue项目热更新慢 查找热更新慢是哪里慢—分析原因 解决办法 vue项目热更新坑 今天在使用vue-cli构造的vue项目时,遇到一个坑. setInterval(() => { console.log('This is one.') }, 10000) 运行后如下: 这时我们修改其中的代码,不刷新网页: setInterval(() => { console.log('This is two.') }, 1000) 结果如下,发现之前的计时函数以久存在,热更新 !=

  • vue中this.$refs的坑及解决

    目录 vue this.$refs的坑 以下三点小坑坑 vue的坑 this.refs为空 总结来说 vue this.$refs的坑 在开发中,有时需要使用到this.$refs ,用于操作真实的DOM节点. 说一说我在使用的时候,在开发时碰到了一个小需求,需要子组件向父组件传参,而且是不需要通过事件传递的,一开始使用this.$emit()来写的,但是一直没有接受到参数,于是放弃了使用this.$emit()的使用. 于是,使用了在父组件中调用子组件的方法,来获取传递的参数.但是还是没有获取

  • vue中遇到的坑之变化检测问题(数组相关)

    最近在项目中遇到了一个问题,不知道为什么,所以最后通过动手做demo实践.查文档的方式解决了,这里做一个总结. 例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://unpkg.com/vue@2.3.3/dist/vue.

  • vue+freemarker中遇到的坑及解决

    目录 vue+freemarker遇到的坑 在这个过程中遇到了几个坑 freemarker的一些坑问题 1.对空对象十分敏感 2.freemarker中的${}与js中的${}冲突 3.渲染数字时出现逗号分隔 4.拼接渲染 5.将对象或数组渲染进js vue+freemarker遇到的坑 java后端开发者做后台管理系统,用模版技术还是挺方便的,但是如果在页面上对数据进行修改,怎么办呢? 可以用jQuery选中各个dom节点的值,然后组装成后台接口中需要的Form,再用ajax请求后台,这种方式

  • 使用vue导出excel遇到的坑及解决

    目录 vue导出excel遇到的坑 需求 准备工作 vue导出excel表报错处理 vue导出excel遇到的坑 需求 Vue+element UI el-table下的导出当前所有数据到一个excel文件里. 先按照网上的方法,看看有哪些坑 准备工作 1.安装依赖:yarn add xlsx file-saver -S 2.在放置需要导出功能的组件中引入 import FileSaver from "file-saver"; import XLSX from "xlsx&q

  • QueryWrapper中查询的坑及解决

    目录 QueryWrapper中查询的坑 首先,先看代码示例 QueryWrapper的查询方法 QueryWrapper QueryWrapper中查询的坑 首先,先看代码示例 List<Entity> list = testService.list(                     new LambdaQueryWrapper<Entity>()                             .eq(ObjectUtils.isNotEmpty(req.get

  • mui-player自定义底部导航在vue项目中显示不出来的解决

    目录 mui-player自定义底部导航在vue项目中显示不出 效果图 总结 mui-player自定义底部导航在vue项目中显示不出 看了作者的源码和案例等,先上代码: <template> <div class="content-box"> <div class="container"> <div>视频插件 mui-player</div> <div id="mui-player&quo

  • vue监听scroll的坑的解决方法

    最近开始用vue写个小项目,踩了不少坑,这里记录下爬坑过程,给有同样经历的人帮助. 问题 今天想在vue的项目里面用下拉加载,然后就直接写了: 但是我发现我切换路由以后依旧其他页面也触发了scrollHandler函数,然后我想到使用了vue-router做的spa项目,window对象不变的,所以需要在每次使用后销毁. 解决办法 我回去看了下vue文档的生命周期,看到了destroyed,然后直接在这个周期内销毁就可以了. 使用throttle出现的新问题 下拉加载一般需要配合throttle

  • vue使用mui遇到的坑及解决

    目录 使用mui遇到的坑记录 mui的js冲突了,有2种解决方法 方法1 方法2 使用mui遇到的坑记录 主要用到webpack打包工具与mui,mint ui,其中mui有不少坑,在此记录 先是用mui的tab组件做了个底部选项卡,如下 不错,样式还行,但是后期发现切换选项的时候会报错Unable to preventDefault inside passive event listener due to target being treated as passive,如下 但是这个错误并不会

  • 解决vscode Better Comments插件在vue文件中不显示相对应的颜色的问题

    最近使用了Better Comments这款插件,发现在ts文件中可以显示对应的颜色,但在vue文件中并不显示对应颜色 解决方法如下: 1.打开插件的配置文件夹,即 c盘 -> 用户 -> 用户名 -> .vscode文件夹 2.extensions目录 -> bttter-comments配置文件夹 3.打开配置文件aaron-bond.better-comments-3.0.2 -> out -> parser.js 4.修改配置文件,添加如下代码 case &qu

  • 关于vue.js中实现方法内某些代码延时执行

    今天在工作时遇见了某些代码需要延时操作的情况.具体情况为前台grid在执行完增删改操作后需要在增加或者修改弹框点击确定导致弹框消失后,grid内数据能够及时更新以便显示增删改操作后的数据.这里的话使用的是vue.js中的setTimeout函数来解决该问题. 代码如下: var that = this; setTimeout(function () { that.modifyDialogVisible = false; grid.api.reloadData(); },500); 值得注意的是这

  • Vue CLI3搭建的项目中路径相关问题的解决

    这是开头 最近在试水 Vue CLI 3,并且尝试配置一个多页面(多应用)项目出来,期间又遇到各种路径问题,于是...于是有了下面的唠叨. 以下都是基于 Vue CLI 3 来举例说明的,使用 2.x 版本的其实也类似 首先,参考 官方文档对静态资源处理的说明,并通过自己的实践,可以总结出以下内容 静态资源可以通过两种方式进行处理: 1.以下情况下,资源不会被 webpack 处理,而是被直接拷贝: 放置在 public 目录下,即使未被使用. 通过绝对路径被引用,即以 / 开头的路径. 2.以

随机推荐