【发布时间】:2014-09-17 16:40:26
【问题描述】:
我正在创建一个 Ember 组件,我需要将滚动事件绑定到一个动态创建的 div。
我的车把代码如下所示:
<div class="searchbarContainer" tabindex="0" bubbles=false>
{{input type="search" name="searchFor" class="searchTextField" placeholder="Search..." value=searchKey}}
{{#if searchKeyNotNull}}
<div class="searchResultsContainer box-shadow" {{bind-attr id="searchBarID"}}>
{{!-- BINDS ID TO searchBarID for searchResultsContainer--}}
{{#if noResults}} {{!-- Then say : "No Results. " --}}
<div class="applicantsName noResults">
No Results found.
</div>
{{else}}
{{!-- For each Row, include visual elements. --}}
{{#each toSearch }}
<div> ... </div>
{{/each}}
<div class='endOfResults'>
End of Results
</div>
{{/if}}
</div>
{{/if}}
</div>
设置逻辑,以便根据在此输入部分中输入的内容,将 searchKeyNotNull 更新为“true”或“false”,noResults 也是如此。
当它现在运行时,div searchResultsContainer 将填充包含结果的 div,并且有一个最大高度。我还启用了溢出,因此用户可以滚动查看结果。
我需要将一个滚动事件绑定到这个 div,这样当它到达末尾时,就会触发一个动作。
现在,这是我开始使用的事件代码:
$('#searchBarID').bind('scroll',function(){
if($(this).scrollTop() + $(this).innerHeight()>=$(this)[0].scrollHeight)
{
alert('end reached');
}
});
哪个有效。不幸的是,当这个 sn-p 运行时,div 还没有被创建,所以这个事件永远不会被绑定。我也尝试过使用jQuery.on函数,但是好像scroll没有冒泡,所以
$('body').on('scroll','#searchBarID', function(){
if($(this).scrollTop() + $(this).innerHeight()>=$(this)[0].scrollHeight)
{
alert('end reached');
}
});
不起作用。
我无计可施,试图找到解决方法;我需要: a)找到一种方法将滚动绑定到动态添加的元素,或者 b) 找出 Ember 何时创建元素,以便我可以立即插入此绑定代码。
解决这两个问题的解决方案对我有很大帮助!
【问题讨论】:
-
查看 didInsertElement 钩子:stackoverflow.com/questions/8881040/…
-
是什么导致id为searchBarID的元素被添加到DOM中?我不熟悉 Ember,但考虑到类似的问题,我会尝试将回调附加到创建 searchBarID 的任何内容,以便事件绑定确保跟随 DOM 节点的创建。
-
我确实想过走这条路:不幸的是,我找不到关于何时以及如何创建 DOM 元素的好文档。谢谢!
-
奥利弗,我确实检查了钩子,它肯定有助于清除我尚未提出的其他问题,但对于这种特殊情况,didInsertElement 只触发一次,并且重新创建了 DOM 元素之后多次。所以不幸的是,它不适用于这种情况。
-
@Darshan
didInsertElement钩子绝对是你要找的。你只需要稍微修改一下你的模板。
标签: javascript jquery ember.js scroll ember-data