在创建时为子元素初始化动态默认值

Initializing dynamic default values for sub-elements on creation

我正在尝试弄清楚如何在初始化本地 DOM 之前使动态值对子元素可用。我创建了一个自定义元素,其中嵌入了 Google Map 元素:

<dom-module id="place-picker">
  <template>
    <google-map api-key="..." />
  </template>
</dom-module>

Polymer({
  is: "place-picker",
  created: function() {
    this.apiKey = someFunctionToRetreiveApiKey()
  }
})

我想立即向 google-map 元素提供 API 键。它需要在 DOM 初始化之前,因为 google-map 元素会尝试立即加载。但是 Polymer 的 properties 没有被评估。使用数据绑定 api-key="[[apiKey]]" 不起作用,因为我没有将其声明为 property.

我以一种有点老套的方式解决了这个问题。 created 回调的上下文是原始 HTML 元素,因此您可以简单地设置它的属性,由于某种原因,它在本地 DOM 创建之前被评估为 属性。我最终得到:

# CoffeeScript
Polymer
  is: "place-picker"
  properties:
    googleWebApiKey:
      type: String

  created: ->
    @setAttribute("google-web-api-key", functionToRetrieveApiKey())

# Slim HTML
template
  google-map api-key="[[googleWebApiKey]]"

我更喜欢使用属性对象的 "value" 键来设置值,但它应该类似于上面提到的创建函数,你也可以使用计算键。

   <dom-module id="place-picker">
     <template>
       <google-map api-key="[[apiKey]]" />
     </template>
   </dom-module>
   Polymer({
     is: "place-picker",
     properties : {
        apiKey : {
          type: String,
          value: functionToRetrieveApiKey()
        }
     }
   })