You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为ember-growl-notification的Flash消息添加Ember选择器?

问题:Ember Growl通知无法添加自定义测试选择器

嘿,我来帮你搞定这个Ember Growl通知的测试选择器问题!我目前在使用Ember Growl Notification组件,执行保存操作时会检查特定条件并显示Flash消息。现在我需要给这个Flash消息添加Ember测试选择器,但用jQuery添加属性后,在元素检查里根本看不到这个选择器。

在控制器的保存点击事件中,我调用了这段代码:

if(productDontAllow && (!!userManagement)) { 
  this.get('emberGrowlService').showNotification({ 
    message: messageDisplay, 
    type: success 
  }); 
  Ember.$('.ember-growl-notification-item').attr('data-test-flash-failure','') 
  return; 
}

问题根源

你现在的写法有个关键问题:调用showNotification之后立刻用jQuery去选元素,这时候组件可能还没完成渲染。Ember的组件渲染是异步的,当你执行showNotification时,通知元素还没被插入DOM,所以jQuery根本找不到这个元素,自然加不上属性。

解决方案

给你几个靠谱的解决思路:

1. 自定义Ember Growl组件(推荐)

最稳妥的方式是扩展原有的Ember Growl组件,让它支持直接传入测试属性:

  • 生成一个自定义组件文件,比如app/components/custom-ember-growl-notification-item.js
  • 在组件模板里绑定测试属性(假设原组件模板结构类似):
{{! app/templates/components/custom-ember-growl-notification-item.hbs }}
<div class="ember-growl-notification-item" data-test-flash={{this.dataTest}}>
  {{! 保留原组件的所有内容 }}
</div>
  • 调用通知时直接传入测试属性参数:
this.get('emberGrowlService').showNotification({ 
  message: messageDisplay, 
  type: success,
  dataTest: 'flash-failure' // 这里传入测试属性值
});

这种方式完全符合Ember的数据流,不会依赖DOM操作,稳定性拉满。

2. 用Ember Run循环延迟DOM操作

如果暂时不想改组件,也可以用Ember的run.next来延迟执行jQuery代码,确保元素已经渲染到DOM里:

if(productDontAllow && (!!userManagement)) { 
  this.get('emberGrowlService').showNotification({ 
    message: messageDisplay, 
    type: success 
  }); 
  // 等当前渲染循环完成后再操作DOM
  Ember.run.next(() => {
    Ember.$('.ember-growl-notification-item').attr('data-test-flash-failure','');
  });
  return; 
}

不过这种方式依赖组件的类名,后续如果组件更新改了类名,代码就失效了,只能作为临时方案。

3. 检查组件自带配置

有些Ember Growl库本身就支持自定义属性或者自定义模板,你可以翻一下它的文档,看看有没有直接传入attributes或者自定义模板的选项,要是有的话直接用官方方案最省心。

内容的提问来源于stack exchange,提问作者Priyanka Bagade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:44