【问题标题】:Ember JS- Apply jQuery after a component is entirely renderedEmber JS - 在组件完全渲染后应用 jQuery
【发布时间】:2017-10-14 05:56:16
【问题描述】:

我是 ember 的初学者,正在尝试实现一个 jQuery 块以延迟 0.5 秒一个接一个地显示我的对象。

我当前显示余烬对象的代码如下所示

{{#if isBusy}}
  <div>Loading..</div>
{{else}}
  {{#if areLeads}}
    {{#each lead in leads}}
      <div>lead.title</div>
    {{/each}}
  {{else}}
    <div>No Leads</div>
  {{/unless}}
{{/if}}

现在,我真正想要的是,在准备好显示线索后,我的代码应该执行,就像 isBusy 为 false 时一样。

以下是我尝试过的东西

_animateLeads: ->
    alert()

didInsertElement: ->
   Ember.run.scheduleOnce 'afterRender', @, => @_animateLeads()

但是,一旦页面开始加载,就会弹出警报。我不太了解 ember 概念并学习相同。

请指导我如何进行,如果我应该提供其他详细信息,请告诉我。任何帮助表示赞赏。谢谢

更新

我最终得到了以下代码

 _animateLeads: Ember.observer 'leads', ->
     if @get('leads')
         $('li.leads-list-lead').each (i) ->
           $(this).fadeOut(1000).delay(2000*i).fadeIn(2000);
           return

 _animateOnInsert: (->
   Ember.run.scheduleOnce('afterRender', @, @_animateLeads)
 ).on('didInsertElement')

但以下仅在更改 leads 时有效。最初,当页面加载时,线索没有按预期出现,即以动画的方式。以下方法也有效,但同样,仅当 leads 更改时

_animateLeads: (->
    if @get('leads')
      $('li.leads-list-lead').each (i) ->
        $(this).fadeOut(1000).delay(2000*i).fadeIn(2000);
).observes('leads')

解决方案

通过混合我在上面所做的对我有用的操作,我最终得到了以下代码。

  _animateLeads: (->
    Ember.run.scheduleOnce('afterRender', @, @_animateActiveLeads)
  ).observes('leads')

  _animateActiveLeads: (->
   if @get('leads') && @get('leadDisplay') == 'active'
     $('li.is-online').each (i) ->
       $(this).fadeOut(0).delay(1000*i).fadeIn(1850);
  )

还有一个类似的问题here 在我之前的搜索中没有出现。接受的答案对我有用。

【问题讨论】:

    标签: jquery ember.js


    【解决方案1】:

    您可能正在寻找的组件钩子是afterRender,它可以让您在渲染后访问 DOM。如果您将所有 div 元素加载为隐藏,然后使用 jQuery 显示它们,您应该大致了解您所追求的。

    目前liquid-fire(Ember 中动画的首选插件)对动画列表没有帮助。有一个未来的底层库被设计为在液体火下运行 (https://github.com/ember-animation/ember-animated) 支持它,但它甚至还不是 alpha。如果您刚刚开始使用 Ember,最好暂时避开它……?

    【讨论】:

    • 您对afterRender 的看法是正确的,正如您所看到的,这就是最初尝试的方法。然而,我改变了点点滴滴,并且能够让它工作。虽然面临另一个问题。一会儿我会发布我的代码
    • 你能看看更新的代码和描述吗?谢谢
    • 我后来发现afterRender 的意思是像_animateLeads 这样的方法。无论如何,我发现上述解决方案对我有用。谢谢你的指导。欣赏!
    • 很高兴听到这个消息!另外两件事。 1. 看起来你正在使用 CoffeeScript? Ember 社区的共识是此时应该避免使用 CoffeeScript,因为 ES6 提供了许多相同的好处。 2. 如果你不介意在这里接受我的回答,它将帮助我升级,以便我可以更好地帮助人们学习 Ember :-)
    • :D 绝对是为了接受答案。关于 CoffeeScript 的使用,我实际上是在对现有项目进行更改并且无法避免使用它。不过,当我从 Scratch 工作时,我会记住这个提示。谢谢。如果它不多,你可以看看this其他问题。我已经成功了,但不明白原因。如果你能帮忙,那就太好了。谢谢
    【解决方案2】:

    你需要看的是Promise()。这是一个异步调用。这并不意味着在你的元素被插入之后它就准备好了。可能需要0.5s、1s、5s……

    您还应该查看ember-concurrency,因为它使这种工作更容易。

    话虽如此,你应该这样做:

    leads: this.get('store').findAll('leads').then(function(leads) {
       //loaded
    })
    

    另外,如果您正在寻找动画,请查看liquid-fire

    【讨论】:

    • 我相信问题是关于如何在数据加载后在元素列表中制作动画......
    • 恐怕我听不懂你。但是,@acorncom 对动画的看法是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2022-10-08
    • 2022-08-18
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多