2015-06-30 32 views
0

如何添加手勢偵聽器而不直接將其添加到模板或「偵聽器」屬性中,以便根據選項添加它們。根據變量添加聚合物手勢偵聽器

例如

Polymer({ 
    is: 'my-element', 

    properties: { 
     enableDrag: Boolean 
    }, 

    listeners: { 
     // DO NOT DEFINE HERE 
     // 'viewer.track': 'handleTrack' 
    }, 

    ready: function() { 
     if(this.enableDrag) { 
      // attach listeners to an element here, something like 
      // this.$.viewer.addEventListener('track', this.boundHandleTrack); 
     } 
    } 
}); 

我試圖addEventListener('track', this.boundHandleTrack)setAttribute('on-track', 'handleTrack')並不能得到任何工作。

謝謝!

+0

爲什麼不直接在'listeners'聽者卻恰恰忽略,如果'!this.enableDrag'事件? –

+0

我不希望在沒有啓用的情況下對元素進行所有跟蹤。您的解決方案如下,我不擔心如果打開然後關閉性能(邊緣情況下) –

回答

1

您應該可以使用listen方法來強制添加手勢。 Fwiw,最好觀察enableDrag,而不是依靠配置在ready時間的財產。

不幸的是沒有unlisten的時刻,因爲(IIRC)的動作代碼沒有爲去除至少1.0聽衆的支持(這是即將推出[TM])。因爲沒有unlisten,因此boundHandleTrack的詭計在那裏。

只要在目標節點上總是收聽on-track,並且處理程序沒有任何操作(比如我不得不在下面做的事情),如果它適用於您的用例,則更容易。

properties: { 
    enableDrag: { 
    type: Boolean, 
    observer: 'enableDragChanged' 
    }, 
    boundHandleTrack: { 
    value: function() { return this.handleTrack.bind(this); } 
    } 
}, 
enableDragChanged: function(drag) { 
    if (drag && this.boundHandleTrack) { 
    this.listen(this.$.viewer, 'track', 'boundHandleTrack'); 
    this.boundHandleTrack = null; 
    } 
}, 
handleTrack: function(e) { 
    if (!this.enableDrag) return; 
    // ... otherwise do stuff 
} 
+0

謝謝斯科特!完全錯過了這個文檔,完美地工作(雖然當聽到的時候非常方便,但是你的解決方案有效) –