如何基于条件自动触发AngularJS Toaster弹窗?
实现Angular Toaster基于表格内容自动触发弹窗
嘿,你离实现需求只差一点点啦!先看看你现有代码里的小问题:你的set_color函数在找到匹配字符后立刻返回了样式对象,导致后面的toaster.pop代码根本没机会执行。另外,咱们还得注意别让弹窗重复触发(比如表格渲染时每一行匹配都弹一次,体验可不好)。
下面给你一步步修正的方案:
1. 调整set_color的逻辑,让toaster能正常触发
把样式返回和弹窗触发的逻辑分开,还要加个标记避免重复弹窗。修改后的代码如下:
// 加个标记,确保同一个匹配场景只弹一次弹窗(如果需要每行都弹可以去掉这个) $scope.hasTriggeredToaster = false; $scope.set_color = function (row) { const inputString = row.Subject; const targetText = "call prepull "; // 直接用includes检查整个字符串,不用多余的循环 if (inputString.toLowerCase().includes(targetText)) { // 只有没触发过的时候才弹弹窗 if (!$scope.hasTriggeredToaster) { $scope.hasTriggeredToaster = true; // 用$timeout包裹,确保在Angular的更新周期里执行,避免弹窗不显示 $timeout(() => { toaster.pop('info', "Hot Rush", "Found new Hot Rush"); }); } // 返回行的样式 return { 'background-color': '#FFCCCB' }; } // 不匹配时返回空样式 return {}; };
这里做了几个优化:
- 删掉了没必要的
for循环,includes(或者indexOf)已经能检查整个字符串是否包含目标文本啦。 - 加了
hasTriggeredToaster变量,防止表格渲染时多个匹配行重复弹弹窗。如果你的需求是每一行匹配都要弹,直接去掉这个标记就行。 - 用
$timeout包裹toaster.pop,确保在Angular的消化周期内执行,避免因为时机不对导致弹窗不显示。
2. 确认依赖配置没问题
你已经在模块和控制器里正确注入了toaster和ngAnimate,这部分保持原样就好:
angular.module('App', ['Services', 'smart-table', 'ui.bootstrap', 'toaster', 'ngAnimate']) .controller('PendingOrderController', function ($scope, $http, Services, $window, $timeout, $rootScope, toaster) { // 你的其他控制器逻辑 });
3. 视图部分保持现有配置
你的<toaster-container>配置完全没问题,继续用就好:
<toaster-container toaster-options="{'time-out': 3000, 'position-class': 'toast-bottom-left', 'close-button':true, 'animation-class': 'toast-bottom-left'}"></toaster-container>
额外小提示
- 如果表格数据会刷新(比如重新请求后端数据),记得在数据更新后重置
$scope.hasTriggeredToaster = false,这样新的匹配行还能触发弹窗。 - 如果想给每个匹配行弹不同的提示(比如显示该行的具体内容),可以把弹窗内容改成带行数据的:
toaster.pop('info', "Hot Rush", `Found Hot Rush: ${row.Subject}`);
这样调整后,当表格里的行Subject包含"call prepull "(不区分大小写)时,就会自动弹出toaster弹窗,同时该行背景变成浅红色啦!
内容的提问来源于stack exchange,提问作者PK-1825
相关产品推荐
相关产品推荐

