当从显示无切换到显示块时,Emberjs组件动作不触发

时间:2014-05-02 03:21:16

标签: css ember.js

我有一个简单的Emberjs组件,它由一个输入字段和一个divs的集合组成,迭代items

最初,items div为display: none,当输入字段为焦点时,items div获得display: block

集合中的每个项目都有一个action处理程序,可以点击selectItem。使用此CSS,单击该项不会触及该操作。

但是,如果取出css规则:.items{ display: none; }(JS小提琴中的第18行),则点击将进入操作。

这是一个JS小提琴http://jsfiddle.net/dylanjha/NQKvy/959/

一个简单的组件:

App.DropDownComponent = Ember.Component.extend({
    selectedName: null,
    items: [{id: 1, name: 'one'}, {id: 2, name: 'two'}],
    actions: {
        selectItem: function(item){
            alert('Selected ' + item.name);
            this.set('selectedName', item.name);
        }
    }
});

组件的模板:

<script type="text/x-handlebars" id="components/drop-down">
  <h1>Drop Down</h1>
  <div>
   {{ input value=selectedName id="form-input" }}
    <div class='items'>
      {{#each item in items}}
        <div class='item' {{action 'selectItem' item}}>
           {{ item.name }}
        </div>
      {{/each}}
    </div>
  </div>
</script>

一些简单的CSS样式输入和项目div

#form-input{
    width:200px;
    font-size:20px;
    padding:5px;
}
#form-input:focus + .items{
    opacity:1;
    display:block;
}
.items{
    font-size:20px;
    -webkit-transition:opacity .2s ease;
    width:200px;
    display:none;
}

1 个答案:

答案 0 :(得分:2)

问题是当您从输入框中失去焦点时,您隐藏了下拉列表。因此,即使您看起来像是在点击元素,但实际上您没有点击任何内容。

话虽如此,在点击行动(或其他原因)之前,您需要将div保持在视野中。

为此,我可能会使用Ember.TextField并连接到触发选项的focusIn事件,然后在选中时关闭。

自定义TextField

App.TextField = Ember.TextField.extend({
  focusOut: function(evt) {
    this.sendAction('focus-out');
  },
  focusIn: function(){
    this.sendAction('focus-in');   
  }
});

模板

{{view App.TextField value=selectedName id='form-input' focus-in='open'}}
<div {{bind-attr class=':items visible:showItems:hideItems'}}>
  {{#each item in items}}
    <div class='item' {{action 'selectItem' item}}>
       {{ item.name }}
    </div>
  {{/each}}
</div>

修改后的组件

App.DropDownComponent = Ember.Component.extend({
    selectedName: null,
    visible: false,
    items: [{id: 1, name: 'one'}, {id: 2, name: 'two'}],
    actions: {
        selectItem: function(item){
            alert('Selected ' + item.name);
            this.set('selectedName', item.name);
            this.set('visible', false);
        },
        open: function(){
            this.set('visible', true);
        }
    }
});

http://jsfiddle.net/w7e9c/