AngularJs:为此我需要在我的控制器中使用 $scope 吗?

AngualrJs: do I require $scope in my controller for this?

我正在尝试模仿 this Plunker,特别是在 ag-grid 的每一行添加一个按钮。

function ageClicked(age) {
    window.alert("Age clicked: " + age);
}

function ageCellRendererFunc(params) {
    params.$scope.ageClicked = ageClicked;
    return '<button ng-click="ageClicked(data.age)">Age</button>';
}

Ag-grid 调用 ageCellRendererFunc 渲染单元格。它正在生成一些 HTML 来生成一个按钮,单击该按钮将导致调用 ageClicked

那个params.$scope.ageClicked = ageClicked;好像是在赋值一个$scope变量,在按钮代码中用到:'<button ng-click="ageClicked(data.age)">Age</button>'.

我不确定为什么有必要分配一个 $scope 变量,以及为什么我们不能只引用一个 $scope 函数。可以吗?

更重要的是,我没有将 $scope 注入我的控制器,因为我在视图中使用了 constroller as 语法。

如何使用 controller as 语法,将 HTML 按钮添加到 ag-grid 单元格,让一段类似的代码正常工作?


[更新] 上面引用的 Plunker 使用了非常旧的 ag-grid 版本。

  1. 我想使用最新版本,v22
  2. 我不想使用 $scope$rootscope,只是 thiscontroller as 语法
  3. 每一行应包含一个单元格,该单元格显示一个按钮,单击该按钮时,将以 soem 行数据作为参数执行一个函数(就像 Plunker 中的 "age",但满足此列表中的 1 和 2 )

ag-grid里面是一个$scope(笨蛋)

在调用之前 ageCellRendererFunc

function ageCellRendererFunc(params) {
    params.$scope.ageClicked = ageClicked;
    eturn '<button ng-click="ageClicked(data.age)">Age</button>';
 }

它初始化 params (4012):

RenderedCell.prototype.createParams = function () {
            var params = {
                node: this.node,
                data: this.node.data,
                value: this.value,
                rowIndex: this.rowIndex,
                colDef: this.column.colDef,
                $scope: this.scope, // <----
                context: this.gridOptionsWrapper.getContext(),
                api: this.gridOptionsWrapper.getApi()
            };
            return params;
        };

所以你可以使用controller as

module.controller("exampleCtrl", function($http) {
  var vm = self;
  /* ... */
 }

plunger with vm


编辑 1

这是一个使用 ag-grid 22.0.0

plunker

(已添加 agGrid.initialiseAgGridWithAngular1(angular)

这段代码不错:

function ageCellRendererFunc(params) {
    params.$scope.ageClicked = ageClicked;
    return '<button ng-click="ageClicked(data.age)">Age</button>';
 }

如您所述,$scopeparams 相关,与您的控制器无关。您的控制器根本不使用 $scope。这是ag-grid的定义。开发人员可以使用另一个变量 - bob,语法为 params.bob.ageClicked = ageClicked;