为什么Polymer不读取行为属性?

时间:2015-12-02 21:49:38

标签: javascript polymer-1.0 web-component

我创建了一个行为,如:

 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);这样的完整路径,这似乎不是正确的方法。我做错了什么?

3 个答案:

答案 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>