【问题标题】:Smart-Table - Preselect a specific row智能表 - 预选特定行
【发布时间】:2015-09-17 14:06:00
【问题描述】:

我正在使用智能表,我需要预先选择一个特定的行。

所以在加载我的列表后,我循环进入它并在到达我想要选择的项目时设置isSelected 属性:

// Preselect a row
for (var i = 0, len = scope.displayCollection.length; i < len; i += 1) {
    var person = scope.displayCollection[i];
    if (person.firstName === 'Blandine') {
        person.isSelected = true;
        scope.selected = person;
        break;
    }
}

它工作正常,但是当我想选择另一行时,预选的行并没有被取消选择!我必须点击它手动取消选择它,然后才能正确选择另一行。

这是解释问题的 JSFiddle:http://jsfiddle.net/6pykn5hu/3/

我尝试了Smart-Table - Select first row displayed (angularjs) 那里的建议,但没有成功。

谢谢

【问题讨论】:

    标签: javascript angularjs smart-table


    【解决方案1】:

    所以我查看了他们的directive,你可以看到它在父指令stTable 中调用了一个函数。 row 绑定到点击处理程序...它从stTable 调用ctrl.select() 函数,此函数又存储最后选择的row。这是你的问题,因为这个事件不会触发它永远不会设置最后点击的行,因此永远不会删除它的类。我为您重写了指令,以便它适用于您想要实现的目标,但很容易改进。

    app.directive('prSystem', function () {
      return {
        restrict: 'A',
          require: '^stTable',
          scope: {
            row: '=prSystem'
          },
          link: function (scope, element, attr, ctrl) {
              var mode = attr.stSelectMode || 'single';
              if(scope.row.isSelected) {
                  scope.row.isSelected = undefined;
                  ctrl.select(scope.row, mode);
              }
    
            element.bind('click', function () {
              scope.$apply(function () {
                ctrl.select(scope.row, mode);
              });
            });
    
            scope.$watch('row.isSelected', function (newValue) {
              if (newValue === true) {
                element.addClass('st-selected');
              } else {
                element.removeClass('st-selected');
              }
            });
          }
      }
    })
    

    【讨论】:

    • 我不喜欢重新定义现有指令,但我更喜欢这个解决方案。谢谢
    【解决方案2】:

    终于找到了解决办法:

    不再有$watch,而是每行都有一个ng-click:

    <tr st-select-row="row" ng-repeat="row in displayCollection" ng-click="selectRow(row)">
    

    我在选择点击的行之前手动取消选择所有行:

    scope.selectRow = function (row) {
        for (var i = 0, len = scope.displayCollection.length; i < len; i += 1) {
            scope.displayCollection[i].isSelected = false;
        }
        row.isSelected = true;
        scope.selected = row;
    }
    

    工作 JSFiddle:http://jsfiddle.net/6pykn5hu/6/

    如果有人有更好的解决方案,我愿意接受其他建议:)

    【讨论】:

    • 我已经使用了它,为了避免迭代,最好使用数组索引和删除 isSelected 值。更新 JSFiddle:jsfiddle.net/uoa9fckr
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多