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

编辑UI Grid单元格时如何触发AngularJS UI Bootstrap弹出框?

问题解答

1. 是否由框架限制导致?

不是。这个问题并非Angular UI Grid或Bootstrap框架的限制,而是由模板语法错误和弹出框状态绑定方式不正确导致的。

2. 代码修改方案

核心问题分析

  • 单元格模板中invalidnamesetter标签存在语法错误,未正确闭合开始标签。
  • popover-is-open使用了插值语法{{}},导致传递的是字符串值而非布尔值,无法触发弹出框的状态更新。

具体修改步骤

步骤1:修复单元格模板的语法错误

在invalidnamesetter标签的末尾添加>,确保标签正确闭合:
原代码片段:

'<invalidnamesetter ' +
'    colfield="COL_FIELD"' +
'    setinvalidnametotrue="grid.appScope.setInvalidNameToTrue()"' +
'    setinvalidnametofalse="grid.appScope.setInvalidNameToFalse()"' +
'  <div' +

修改后:

'<invalidnamesetter ' +
'    colfield="COL_FIELD"' +
'    setinvalidnametotrue="grid.appScope.setInvalidNameToTrue()"' +
'    setinvalidnametofalse="grid.appScope.setInvalidNameToFalse()"' +
'>' +
'  <div' +

步骤2:修正popover-is-open的绑定方式

移除插值语法{{}},直接绑定到控制器作用域的布尔变量:
原代码:

'      popover-is-open="{{grid.appScope.isInvalidName}}" ' +

修改后:

'      popover-is-open="grid.appScope.isInvalidName" ' +

步骤3:初始化布尔变量(可选但推荐)

在控制器中初始化isInvalidName为false,避免初始状态为undefined:

mod.controller('ctrl', function ($scope) {
  $scope.isInvalidName = false; // 添加这行

  $scope.setInvalidNameToTrue = function() {
    $scope.isInvalidName =true;
  }

  // ... 其余代码不变
});

修改后的完整代码

JavaScript部分

var mod = angular.module('app', ['ngAnimate', 'ngSanitize', 'ui.bootstrap', 'ui.grid', 'ui.grid.edit']);

mod.directive('invalidnamesetter', function () {
  return {
    restrict: 'E',
    transclude: true,
    scope: {
      colfield: '=',
      setinvalidnametotrue: '&',
      setinvalidnametofalse: '&'
    },
    template: '<div ng-transclude></div>',
    link: function (scope) {
      scope.$watchGroup(['colfield'], function (values) {
        if(values[0] === 'foo') {
          scope.setinvalidnametotrue();
        } else {
          scope.setinvalidnametofalse();
        }
      });
    }
  }
});

mod.controller('ctrl', function ($scope) {
  $scope.isInvalidName = false;

  $scope.setInvalidNameToTrue = function() {
    $scope.isInvalidName =true;
  }

  $scope.setInvalidNameToFalse = function() {
    $scope.isInvalidName =false;
  }

  $scope.gridOptions = {
    data: [{name: ""}],
    columnDefs: [
      {
        field: 'Name',
        cellTemplate: '' +
          '<invalidnamesetter ' +
          '    colfield="COL_FIELD"' +
          '    setinvalidnametotrue="grid.appScope.setInvalidNameToTrue()"' +
          '    setinvalidnametofalse="grid.appScope.setInvalidNameToFalse()"' +
          '>' +
          '  <div' +
          '      uib-popover="foo is not allowed" ' +
          '      popover-append-to-body = "true" ' +
          '      popover-trigger="\'none\'" ' +
          '      popover-is-open="grid.appScope.isInvalidName" ' +
          '      class="form-control">' +
          '    {{COL_FIELD}}' +
          '  </div>' +
          '</invalidnamesetter>'
      }
    ]
  };
});

HTML部分(无需修改)

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular-animate.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular-sanitize.js"></script>

  <script src="https://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.js"></script>
  <link rel="stylesheet"
        href="https://netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

  <script src="https://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/release/4.4.5/ui-grid.min.js"></script>
  <link rel="stylesheet"
        href="https://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/release/4.4.5/ui-grid.min.css"/>
</head>

<body ng-app="app">

<div ng-controller="ctrl">
  <label>isInvalidName = {{isInvalidName}}</label>
  <div ui-grid="gridOptions" ui-grid-edit></div>
</div>

</body>

</html>

修改说明

  • 修正语法错误后,Angular能正确解析模板结构。
  • 直接绑定布尔变量到popover-is-open,确保弹出框能实时响应isInvalidName的状态变化。
  • 初始化变量可避免初始状态下的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:53:13