Comments (21)
你所说的自定义宏,我写个例子,你看是否合适
vm
#macro (showHead $defaultTitle)
#showTitle ($defaultTitle)
#end
#set($title = "hello")
#showTitle($title)
js
velocity.render(str, {}, {
showTitle: function(title){
return '<title>' + title + '</title>';
}
});
结果
<title>hello</title>
不过,不是很明白,需要覆盖吗?如果页面上有定义宏,为什么需要覆盖,而不是直接调用?我的理解,如果页面上没有定义宏,可以使用自定义的js函数取代宏。但是自定义的js函数和宏定义同时存在,这个需要覆盖吗?不明白应用场景
from velocity.js.
覆盖我只是举个例子,比如现有的 parse 不能满足需求,我可以重写,主要的需求还是自定义宏。
from velocity.js.
嗯,parse
以前是没有处理,只在web端处理了一下,我一会儿发布下,增加parse
功能。
from velocity.js.
parse
有一个需求
如 #parse('/path/to/a.vm')
,可以配置多个 dir,~/a
~/b
~/c
,根据顺序依次找文件是否存在 (~/a/path/to/a.vm
),找到返回,找不到报错。
不过也可以开放出来自己写
from velocity.js.
#parse
属于比较特殊的宏,还有webx自定义的noescape
,对于#parse
现在提供静态方法重写的方式来自定义,不过似乎不是很好。先看看,如果不能满足需求,再另外处理吧。
from velocity.js.
一楼的需求能支持么,现在很麻烦,每次 render 的时候都要把,macro 加到要 render 的字符串前。
from velocity.js.
好了,你看看现在这样够用了不,click me. render方法的第二个参数,传递自定义的js函数宏。
from velocity.js.
能否支持嵌套的
macros = {
cmsparse: function(str){
return parse(str)
}
}
或者有什么方案
from velocity.js.
var macros = {
cmsparse: function(str){
//第二个参数临时变量
return this.eval(str, {name: "hanwen"});
},
d: function($name){
return this.eval('I am $name!');
}
};
var vm = '#cmsparse($str)';
var o = {
str: 'hello $foo.bar, #d()',
foo: {bar: 'world'}
};
现在这样,使用this.eval
,不过现在macros
的上下文环境需要强者设置为当前velocity对象实例了,不过这样应该没有问题吧,可以通过this
调用很多内部api。test case
from velocity.js.
现在 parse 是不是不用这样写了? velocity.Compile.getParseString
,也可以直接定义?
from velocity.js.
这个这处理自定义的#macro
,对于系统定义的parse
还没有开放出来,不过,似乎也可以开发出来,你觉得需要开放不?
from velocity.js.
我觉得上下文传的 macro 可以覆盖页面和系统定义的 macro。
我现在的 parse 是要自定义的,然后 cmsparse 需要调用 parse,所以像下面这样实现最简单
macros = {
cmsparse: function(str){
return macros.parse(str);
},
parse: function(str) {
}
}
from velocity.js.
嗯,现在我把#parse, #include
这样的宏当成普通的宏一样处理了,原来的方案getParseString
已经去掉,全部交给用户自定义吧,这样比较靠谱,不然我还得写#include
,#evaluate
,拿出来还方便。不过,因为需要使用到this
内部api,为了保持this
不变,调用的时候需要使用macros.include.apply(this, arguments
这样方式。
var macros = {
cmsparse: function(str){
//为了保持this,请使用apply这样的方式
return macros.include.apply(this, arguments);
},
include: function(str){
return this.eval(str, {name: "hanwen"});
},
parse: function(file){
return file;
},
d: function($name){
return this.eval('I am $name!');
}
};
var vm = '#cmsparse($str)';
var vm1 = '#parse("a.vm")';
var o = {
str: 'hello $foo.bar, #d()',
foo: {bar: 'world'}
};
from velocity.js.
恩,这样好,又比较简洁易于扩展
from velocity.js.
我一直想把内部接口开放出来,没想好怎么搞,你的提议很不错。
from velocity.js.
恩,可以先发布一个版本了
from velocity.js.
有没有block、extends?
from velocity.js.
@yanni4night http://velocity.apache.org/engine/devel/user-guide.html 这份文档,没有看到block和extends的介绍啊,block是define么?
from velocity.js.
@shepherdwind 我确实也没有,不知道大家怎么用,习惯了用twig的extends继承功能,在父模板中留坑,从子模板上溯到父模板渲染感觉比include方便。参考 http://badqiu.iteye.com/blog/558194
from velocity.js.
@yanni4night 继承的使用确实要好很多,twig的那种还蛮好的。在velocity模板中实现,还得增加新的block语法才行,这个现在velocityjs没有支持。
不过,我不是很明白,velocity是基于java的模板引擎,就算velocityjs支持继承的语法,又有什么用呢,velocityjs现在还是主要用于模拟java的velocity模板解析过程。
from velocity.js.
关于继承的问题,单独到另外一个issue里面讨论吧 #27 。
from velocity.js.
Related Issues (20)
- Dashes in Identifiers HOT 1
- Support format quiet syntax $!{reference}
- String.replace() is not global HOT 2
- Map.remove() is not implemented HOT 2
- String pipe symbol not implemented HOT 1
- Support the $util.qr directive HOT 1
- IE or older browsers not supported!!! HOT 1
- Bug with #set inside #foreach: setting properties on loop variable from foreach doesn't work HOT 1
- TypeError: Cannot read property 'charCodeAt' of undefined HOT 1
- 如何实现webpack的热更新? HOT 2
- String matches does not work HOT 2
- 变量名称是null时报错 HOT 1
- Bug with rendering #foreach and $util.map.copyAndRemoveAllKeys HOT 13
- How to figure out which references in AST are able to be set in context HOT 2
- Support method with arguments HOT 2
- Parse String to Int HOT 2
- ESM module build? HOT 10
- #set with array fails for unknown reason HOT 1
- 无法解析vue中使用element-ui的$message语法 HOT 1
- Date functions not working HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from velocity.js.