Polymer 2.0无法声明名为lang的函数问题求助
这个问题我之前也碰到过!核心原因是Polymer 2.x的Polymer.Element原型上已经内置了lang的getter方法——它对应标准HTML元素的lang属性,所以你自定义的lang方法被这个内置的getter覆盖了,调用时自然返回的是元素的lang属性值(默认就是undefined),而不是你写的函数。
解决办法
这里有几个可行的方案,按推荐度排序:
更换函数名(最稳妥)
最简单的方式就是给你的国际化函数换个名字,比如_lang、translate或者localize,避开和标准HTML属性/Polymer内置方法的冲突。修改后的代码示例:class MyGuidepost extends Polymer.Element { static get is() { return 'my-guidepost'; } static get properties() { return { prop1: { type: String, value: 'my-guidepost' } }; } ready() { super.ready(); this.test(); } // 更换为不会冲突的函数名 _lang(param) { return "asdsad"; } test() { console.warn(this._lang()); // 现在能正常返回"asdsad"了 } } window.customElements.define(MyGuidepost.is, MyGuidepost);使用Polymer官方的国际化行为(更符合生态)
如果你打算长期维护项目,建议直接用Polymer官方提供的app-localize-behavior,它是专门为Polymer 2.x设计的国际化方案,能更好地和Polymer的数据绑定、属性系统配合,避免自己造轮子带来的冲突问题。强制覆盖内置getter(不推荐)
如果你实在不想换名字,可以在ready方法里重新定义这个方法,但这种做法可能会和Polymer的内部逻辑产生冲突,不建议在生产环境使用:ready() { super.ready(); // 强制覆盖内置的lang getter this.lang = (param) => { return "asdsad"; }; this.test(); }
关于Polymer的保留名称
Polymer 2.x会继承标准HTMLElement的所有属性对应的getter/setter,比如lang、title、hidden、dir这些,同时还有一些Polymer内部使用的方法(通常以下划线开头,比如_ready、_propertyChanged)。为了避免冲突,自定义方法尽量:
- 避开标准HTML元素的属性名
- 遵循Polymer的惯例,私有/内部方法用下划线开头
内容的提问来源于stack exchange,提问作者Kuba Šimonovský

