fex-team / jello

Front End Integrated Solution for J2EE Velocity.
206 stars 49 forks source link

如何在 #block 中使用 #script( ) #83

Open ghost opened 8 years ago

ghost commented 8 years ago

背景是这样的: 目前正在使用 jello 开发项目,info.vm 是一个公共的文件,所有的页面文件都会引用,在它内部加载了一个用于全部页面文件的 info.js

遇到的问题: 业务有变化,在其中加入了独立逻辑的新文件( sq.vm,它有自己的 sq.js ),在样式方面仍然沿用 info.vmsq.vm的父模板是 info.vm。 他们的 js 文件都拥有 submit 等等事件,所以出现了不必要的多次监听。 我想过使用e.stopImmediatePropagation方法,但是发现可能是继承的关系, info.js 先于 sq.js 加载,是否可以让sq.vm仅仅覆盖 info.vmjs 部分,如下:

// info.vm
#script()
    require(['js/page/info/info'], function (InfoPage) {
        InfoPage._init()
    })
#end

//sq.vm
#script()
    require(['js/page/sq/sq'], function (Sq) {
        Sq._init()
    })
#end

尝试过使用 #block 包含 #script 的方法,但是发现不行

2betop commented 8 years ago

居然 #script 没法用 #block 替换

2betop commented 8 years ago

特意试了下,用 #block 是可以的。

可能你没用正确,用来覆盖的 #block 必须是 #extend 的孩子节点,你别放到某个 #block 里面。

2betop commented 8 years ago

info.vm

<div>xxx</div>
#block("info_script")
#script()
    require(['js/page/info/info'], function (InfoPage) {
        InfoPage._init()
    })
#end
#end

sq.vm

#extend("./info.vm")
  #block("info_script")
  #script()
    require(['js/page/sq/sq'], function (Sq) {
        Sq._init()
    })
#end
  #end
#end
ghost commented 8 years ago

貌似这边依然不行,我进行了覆盖,但是发现在 sq 页面 中,依然还是会加载 info.vm 中引入的 js 文件,略有蛋疼。我这边使用的 jellov1.0.3 版本,不知道是否是版本的问题?多谢帮助

2betop commented 8 years ago

我刚刚是 fis3-jello 测试的,你替换下最新的 jar 包试试? jello server open 后可以能找到原来的 jar 文件。

最新的jar 有两个途径。

  1. https://github.com/fex-team/fis-velocity-tools 自己 maven package 后就能生成。
  2. fis3 server start --type jellofis3 server open 后可以找到。
ghost commented 8 years ago

可以了。 多谢啦,我先完成业务代码,后续考虑再是否升级到 fis3-jello