我创建了一个行为,如:
var MB = MB || {}; //set Marvin Behaviors namespace
MB.translate = {
properties: {
key: {
type: String,
value: 'Foo',
notify: true
}
},
someMethod: function(){
console.log(this.key);
}...
当我在其他组件中混合此行为时,我会将undefined
记录到控制台。
解决它的唯一方法是在原始方法中引用像console.log(MB.translate.properties.key.value);
这样的完整路径,这似乎不是正确的方法。我做错了什么?
答案 0 :(得分:0)
我怀疑是否有效;该上下文中的key
符合预期undefined
- 除非您在原型中进一步定义。
您应该使用console.log(this.properties.key);
。
注意:我对Polymer一无所知,但我的理解是这是ECMAScript特有的,因此也是Polymer的特定。我可能错了,随意“标记”我并纠正这个。
答案 1 :(得分:0)
this
的范围是指函数,而不是整个对象字面值。要解决它,你必须像你一样引用整个路径,或者你创建一个绑定函数,但是你不能在对象文字定义中执行此操作,之后才能执行此操作:
var MB = MB || {}; //set Marvin Behaviors namespace
MB.translate = {
properties: {
key: {
type: String,
value: 'Foo',
notify: true
}
}
}
MB.translate.someMethod = function() {
console.log(this.key);
}.bind(MB.translate.properties)
MB.translate.someMethod();
编辑:抱歉,我不完全正确:正确的答案是this
指的是父母的范围。所以你也可以这样做,我想你想要的更多:
someMethod: function(){
console.log(this.properties.key);
}
答案 2 :(得分:0)
您是否尝试在混合行为时引用完全限定的对象?
我认为您的命名空间应该附加到窗口对象:
window.MB = window.MB || {};
MB.translate = { ... }
然后你可以像这样混音:
<script>
Polymer({
is: 'my-element',
behaviors: [MB.translate]
});
</script>