1

我正在尝试根据数据中的标志设置可编辑/不可编辑的行。我可以在 angular 1.5 组件之外工作,但似乎无法访问组件中控制器内的 row.entity。

function memberDisplayCtrl ($scope, memberFactory,uiGridConstants) {
    var ctrl = this;
    ctrl.people = memberFactory.getMembers();

    ctrl.checkStatus = function(ctrl){

        // How do I do something like this:
        // if (ctrl.row.entity.Status === 'Y') { return 'true'; } else {return 'false';}
    };

    ctrl.gridOptions = {
        enableSorting: true,
        enableCellEdit:false,
        cellEditableCondition: ctrl.checkStatus(ctrl),
        enableHorizontalScrollbar : 0,
        enableVerticalScrollbar   :  0,
        enableColumnMenus: false,
        minRowsToShow: ctrl.people.length,
        columnDefs: [
            { displayName:'First Name', name: 'fname', enableCellEdit:true },
            { displayName:'Last Name', name: 'lname', enableCellEdit:true },
            { displayName:'Date of Birth', name: 'DOB', type:'date', enableCellEdit:true, cellFilter: 'date:"yyyy-MM-dd"'},
            { displayName:'Address', name: 'address', enableCellEdit:true},
            { displayName:'Status',name: 'Status', enableCellEdit: true}
        ],
        data : ctrl.people
    };

}

我很确定我有范围问题,但似乎无法弄清楚。如何访问 row.entity?我的控制器内部有一个隔离范围(因为它是组件的一部分)

戳这里:https ://plnkr.co/edit/Wz7gKs

谢谢

4

1 回答 1

0

只需将一个函数传递给cellEditableCondition而不是执行它:

cellEditableCondition: ctrl.checkStatus

请注意,该函数接收到的参数不是当前控制器的this(在您的情况下别名为ctrl),而是ui-grid的范围,所以我将ctrl重命名为scope

function memberDisplayCtrl ($scope, memberFactory,uiGridConstants) {
    var ctrl = this;
    ctrl.people = memberFactory.getMembers();

    ctrl.checkStatus = function(scope) {
      return scope.row.entity.Status === 'Y'
    };

    ctrl.gridOptions = {
        enableSorting: true,
        enableCellEdit:false,
        cellEditableCondition: ctrl.checkStatus,
        enableHorizontalScrollbar : 0,
        enableVerticalScrollbar   :  0,
        enableColumnMenus: false,
        minRowsToShow: ctrl.people.length,
        columnDefs: [
            { displayName:'First Name', name: 'fname', enableCellEdit:true },
            { displayName:'Last Name', name: 'lname', enableCellEdit:true },
            { displayName:'Date of Birth', name: 'DOB', type:'date', enableCellEdit:true, cellFilter: 'date:"yyyy-MM-dd"'},
            { displayName:'Address', name: 'address', enableCellEdit:true},
            { displayName:'Status',name: 'Status', enableCellEdit: true}
        ],
        data : ctrl.people
    };

}

另外,我看到了您的注释代码:

if (ctrl.row.entity.Status === 'Y') { 
  return 'true'; 
} 
else {
  return 'false';
}

在这里你打算在两种情况下都返回字符串变量,它总是被评估为布尔值true,你应该返回布尔值:

if (ctrl.row.entity.Status === 'Y') { 
  return true; 
} 
else {
  return false;
}

这等于更短的版本:

return ctrl.row.entity.Status === 'Y';

plunker:https ://plnkr.co/edit/KXbJ40?p=preview

于 2016-10-14T18:23:43.640 回答