🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 1.8 属性 ### 1.8.1 引用属性 属性引用是模板中的重要一部分,Beetl 支持属性同 JavaScript 的支持方式一样,如下 - Beetl支持通过 `.` 号来访问对象的的属性,如果 JavaScript 一样。如果 User 对象有个 getName() 方法,那么在模板中,可以通过 `${xxx.name}` 来访问 - 如果模板变量是数组或者List类,这可以通过 `[]` 来访问,如 `${userList[0]}` - 如果模板变量是Map类,这可以通过 `[]` 来访问,如 `${map["name"]}` ,如果 key 值是字符串类型,也可以使用 `${map.name}` —— 但不建议这么使用,因为会让模板阅读者误以为是一个 Pojo 对象 - Beetl 也支持Generic Get方式,即如果对象有一个 `public Object get(String key)` 方法,可以通过 `.` 号或者`[]` 来访问,譬如 `${activityRecord.name}` 或者 `${activityRecord["name"] }` 都将调用 activityRecord 的 `get(String key)` 方法。如果对象既有具体属性,又有Generic get(这种模型设计方式是不值得鼓励),则以具体属性优先级高。 - Beetl也可以通过 `[]` 来引用属性,如 `${user["name"]}` 相当于 `${user.name}`。这跟 JavaScript 保持一致。但建议不这么做,因为容易让阅读模板的人误认为这是一个Map类型。但好处是可以动态引用属性,比如; ```java var attrName="age"; var age=user[attrName] ``` - 需要知道Java集合,数组长度,统一用虚拟属性`~size`来表示 ```java var list=[1,2,3]; var size = list.~size ``` * 虚拟属性:Beetl 还可以定义额外的对象属性,而无需更改java对象,这叫着虚拟属性,如,对于所有集合,数组,都有共同的虚拟属性size.虚拟属性是“.~”+虚拟属性名 ```javascript template.binding("list",service.getUserList()); template.binding("pageMap",service.getPage()); //在模板里 总共 ${list.~size} <% for(user in list){ %> hello,${user.name}; <% } %> 当前页${pageMap['page']},总共${pageMap["total"]} ``` ### 1.8.2 属性赋值 Beetl2.7.0 开始支持对象赋值,如: ```javascript <% var user = .... user.name="joelli"; user.friends[0] = getNewUser(); user.map["name"] = "joelli"; %> ``` 赋值很少用于模板引擎,在规则引擎,脚本引擎使用场景倒是可以修改对象属性。Beetl支持语法定制,可以根据使用场景禁止对象赋值。