重要需求:EmberJS相当于jQuery';s.ready()函数,该函数保持打开状态

重要需求:EmberJS相当于jQuery';s.ready()函数,该函数保持打开状态,jquery,events,ember.js,event-handling,Jquery,Events,Ember.js,Event Handling,嗯。因此,我之所以将其列为重要需求,是因为我在过去写过另一个类似的问题,当我被要求给出一个我试图完成的具体事情时,我给出了答案,而整个事情都与此相关,但没有解决任何问题 现在我喜欢上了我想要完成的5件不同的事情,这些事情本来可以通过jQuery和.ready()来完成,而且所有的功能都可以在半小时内完成。我花了3天时间搜索谷歌,阅读官方的Ember 2.13.0文档等,但都没有结果 这是必须存在的,因为我只是拒绝相信我不能将始终在路由上运行的事件侦听器放在路由上,而不管它转换到子路由或单击对象,

嗯。因此,我之所以将其列为重要需求,是因为我在过去写过另一个类似的问题,当我被要求给出一个我试图完成的具体事情时,我给出了答案,而整个事情都与此相关,但没有解决任何问题

现在我喜欢上了我想要完成的5件不同的事情,这些事情本来可以通过jQuery和.ready()来完成,而且所有的功能都可以在半小时内完成。我花了3天时间搜索谷歌,阅读官方的Ember 2.13.0文档等,但都没有结果

这是必须存在的,因为我只是拒绝相信我不能将始终在路由上运行的事件侦听器放在路由上,而不管它转换到子路由或单击对象,或者它已经呈现并且没有呈现两次。我唯一能够开始工作的是组件上的
didRender
。没有别的办法

我在路上试过了。不起作用。我在路上试过了。不起作用。我在谷歌上搜索了一下,只为在这里找到余烬1x的答案

我想做的就是做这样的事情:

Ember.$('input,select,textarea').on('change',function() {
    do stuff here
}
这将:

  • 输入路线时工作
  • 当用户单击子路由时,仍将继续运行*
  • 永远不要停止工作,除非用户完全退出实际的父路由并转到其他地方
  • 一直跑
组件上的
didInsertElement
所做的是,当它处于打开路径(android/setup)时。。它实际上会起作用。。直到我单击指向不同子管线的不同选项卡。然后它停止工作,当返回到它开始的原始子路线时,它仍然不工作

我不知道这是否是因为组件没有再次渲染,或者是什么原因,但我无法理解为什么它停止工作,事件侦听器死亡

我在这里找到了其他答案,人们说使用
didInsertElement
。。它对我不起作用,因为事件侦听器在与页面交互后死亡。我需要的是,在从根部选择一条完全不同的路线之前,不会停止聆听的东西


如果你想知道我为什么要这么做,我可以马上给你5个理由,因此,我更愿意解释我所要求的实际的编程功能,而不是功能方面的单一任务或目标,因为我已经需要它很多次了,我不得不绕着屁股走到我的肘部,因为我不能。准备好它,今天就到此为止。

这个答案可能不适用于所有人,但是如果你想解决你的用例,你可以尝试一下

import Ember from 'ember';
export default Ember.Route.extend({
    deactivate(){
     //Here you can clear all the event handler stuff.
     Ember.$('input,select,textarea').off('change');
    },
    actions:{
        didTransition(){
            Ember.run.later('afterRender', () => {
              //this will ensure that inside this route all html element is ready,
              //Now you can whatever stuff is required to deal with html element.
              //like registering event handler. 
              Ember.$('input,select,textarea').on('change',function() {
                //  do stuff here
                }); 
            }, 500);
            return true;
        }
    }
});
注:
1.请记住,didTransition hook应该在actions hash中定义
2.它应该
返回true
,然后才会传播到父路由。
3.如果您编写了didTransition hook,只需确保所有子路由都应
返回true


路由转换后,无论可用的html内容是什么,都将为
change
事件触发。但这将不适用于转换后创建的DOM,例如基于
if
的隐藏/显示组件可能未为
更改
事件注册块。对于那些需要使用
didInsertElement
this.$('input,select').on('change',function(){})
和willDestroyElement钩子destory handler
this.$('input,select').off('change')

我假设这部分UI使用的每个路由都必须使用它。。例如,它有多个配置部分的选项卡,但每个部分都是一个子路由。所以每一条路线我都要这么做?500是什么意思?这是毫秒级的延迟吗?不。你可以单独为父路由执行。也就是说,如果导航到子路由,则其父路由
didtransformation
也将被调用.Hm。可以这很有道理,也很酷。然后,我必须让属性位于父路由中,并传递给子组件以供该子组件读取。这似乎不起作用。。didTransition()会像您所说的那样为子路由激发,但事件侦听器/处理程序似乎不起作用?我让它输出一个简单的console.log,它永远不会启动。我在hook中包含了清理部分。够了。