是否有聚合物模板的印章事件?

时间:2015-03-09 23:02:28

标签: javascript html polymer

我试图在每次标记其内容时将输入元素聚焦在聚合物模板内。问题是在模板加载之前我无法选择输入元素。目前,我只是在模板加载后使用setTimeout来聚焦输入100ms,但我想知道是否有更优雅的解决方案。此外,自动聚焦属性不起作用,因为模板可能会多次取消标记和重新标记。现在,我的代码看起来像这样(这是在聚合物元素定义中):

Polymer({

  // ...

  showInput: false,

  makeInputVisible: function() {
    this.showInput = true;
    var container = this.$.container;
    setTimeout(function() {
      container.querySelector("#input").focus();
    }, 100);
  },
});
<div id="container">
  <template if="{{showInput}}">
    <input id="input" is="core-input" committedValue="{{inputValue}}" />
  </template>
</div>

但我更喜欢这样的东西:

Polymer({

  // ...

  showInput: false,

  makeInputVisible: function() {
    this.showInput = true;
  },

  focusInput: function() {
    this.$.container.querySelector("#input").focus();
  },
});
<div id="container">
  <template if="{{showInput}}"
            on-stamp="{{focusInput}}">
    <input id="input" is="core-input" committedValue="{{inputValue}}" />
  </template>
</div>

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

使用Polymer 1.0时,模板会在标记时触发“dom-change”事件。但是,使用dom-if模板会产生显着的性能成本,因为它们需要操作dom树。做这样的事情要好得多:

<div id="container">
  <input id="input" hidden="[[!showInput]]" value="{{inputValue::input}}">
</div>
observers: [
  '_showInputChanged(showInput)',
],

_showInputChanged: function (showInput) {
  if (showInput) {
    this.$.input.focus();
  }
},

答案 1 :(得分:0)

有多种方法可以做到这一点,但最简单的方法是观察价值,例如:

// you already have an Id assigned to the input, so you can use that reference.
.. 
 showInputChanged: function() {
  this.$.input.focus();
 }
..

如果需要跨组件通信,您还可以定义自己的事件处理程序:

..
 ready: function() {
  this.addEventListener("on-stamp", function(e) {
   if(e.detail.value != undefined) this.$.input.value = e.detail.value; 
   this.$.input.focus();  
  });
 }
..

然后你可以从任何地方使用fire事件,甚至设置值,例如

   setValue: function(s) {
    this.fire("on-stamp", {value: s});
   },