2015-12-02 81 views
1

我創建像一個行爲:聚合物爲什麼不讀行爲屬性?

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

我懷疑這是否奏效; key在這方面是undefined如預期 - 除非您在原型中進一步定義它。您可以使用console.log(this.properties.key);

注意:我對聚合物一無所知,但我的理解是,這是特定於ECMAScript,因此對聚合物。我可能是錯的,隨時「標記」我並糾正這一點。

+0

這是聚合物的一個特點:HTTPS://www.polymer -project.org/1.0/docs/devguide/properties.html – AlexNasonov

+0

@AlexNasonov同意,但這是一個對象成員,你指的是它的範圍;這是我的觀點 –

+0

只是試圖使它這樣:https://www.polymer-project.org/1.0/docs/devguide/behaviors.html – AlexNasonov

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); 
} 
+0

它不會像這樣工作,與Polymer網站上給出的示例相比,它不同。 https://www.polymer-project.org/1.0/docs/devguide/behaviors.html – AlexNasonov

+0

我概述了兩種方法的工作,這與Polymer無關。 –

0

你是否試圖在行爲中混合時引用完全限定的對象?

我覺得你的命名空間應該被附加到窗口對象:

window.MB = window.MB || {}; 
MB.translate = { ... } 

然後你就可以混入這樣的:

<script> 
    Polymer({ 
    is: 'my-element', 
    behaviors: [MB.translate] 
    }); 
</script>