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

Angular.js $mdDialog控制器递归调用后选中行数据无法渲染问题

问题原因排查

你代码存在两个核心问题:

  • 低级拼写错误:HTML中下一步按钮的事件绑定写为nrh-click,正确应为ng-click,会直接导致点击事件不触发,逻辑无法执行。
  • 逻辑设计问题:每次点击下一步都重复新建弹窗,未关闭原有弹窗导致堆叠,且传递参数时带入了旧的aaa属性,覆盖了新控制器的赋值逻辑,同时preserveScope: true会导致作用域污染,引发渲染异常。
  • 你查阅到的broadcast方案属于跨作用域通信方案,当前需求完全不需要用到,采用更简单的逻辑即可解决。

最优解决方案:复用单弹窗,直接更新数据

不需要每次新建弹窗,同一个弹窗内直接更新绑定数据即可,双向绑定会自动刷新视图,逻辑更简洁性能更好。

修改后的控制器代码

function popupController($mdDialog, locals) {
    var dp = this;
    // 初始化参数,单独赋值避免旧值干扰
    dp.aaas = locals.aaas;
    dp.order = locals.order;
    dp.title = locals.title;
    dp.aaa = dp.aaas[dp.order];

    dp.hideDialog = function () {
        return $mdDialog.hide();
    };

    dp.cancelDialog = function () {
        return $mdDialog.cancel();
    };

    dp.nextFunctionPopup = function () {
        // 边界判断,避免数组越界
        if (dp.order + 1 >= dp.aaas.length) return;
        // 直接更新索引和对应数据,视图自动渲染
        dp.order++;
        dp.aaa = dp.aaas[dp.order];
    };

    // 可选:添加上一步逻辑
    dp.prevFunctionPopup = function () {
        if (dp.order - 1 < 0) return;
        dp.order--;
        dp.aaa = dp.aaas[dp.order];
    };
}

修改后的HTML按钮部分代码

<md-dialog-actions layout="row" layout-align="end center">
    <!-- 修复点击事件拼写错误,添加按钮文字,加禁用逻辑 -->
    <md-button ng-if="dp.aaas.length > 1" class="md-raised md-primary"
        ng-click="dp.prevFunctionPopup()" ng-disabled="dp.order === 0">
        上一步
    </md-button>
    <md-button ng-if="dp.aaas.length > 1" class="md-raised md-primary"
        ng-click="dp.nextFunctionPopup()" ng-disabled="dp.order === dp.aaas.length - 1">
        下一步
    </md-button>
    <md-button ng-click="dp.hideDialog()" class="md-raised">
        关闭
    </md-button>
</md-dialog-actions>

如果你坚持要使用多弹窗切换的原有逻辑,按以下修改即可

修复后的控制器代码

function popupController($mdDialog, locals) {
    var dp = this;
    dp.aaas = locals.aaas;
    dp.order = locals.order;
    dp.title = locals.title;
    dp.aaa = dp.aaas[dp.order];

    dp.hideDialog = function () {
        return $mdDialog.hide();
    };

    dp.cancelDialog = function () {
        return $mdDialog.cancel();
    };

    dp.nextFunctionPopup = function () {
        var index = dp.aaas.findIndex(aaa => aaa.id === dp.aaa.id);
        var nextOrder = index + 1;
        if (nextOrder >= dp.aaas.length) return;
        // 先关闭当前弹窗,再打开新弹窗,避免堆叠
        $mdDialog.hide().then(() => {
            $mdDialog.show({
                bindToController: true,
                preserveScope: false, // 关闭旧作用域继承,避免污染
                ariaLabel: 'AAAAAA',
                templateUrl: 'aaa-popup.html',
                controller: 'popupController',
                controllerAs: 'dp',
                // 只传必要参数,不带旧的aaa属性
                locals: {
                    aaas: dp.aaas,
                    order: nextOrder,
                    title: dp.title
                }
            });
        });
    };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:00:01