AngularJS 插件智能 Table 尝试设置默认选定行时出现问题
AngularJS plugin Smart Table issue when trying set default selected row
我使用带有默认 selection 的 Smart-Table 通过使用以下辅助指令来执行 selection,突出显示 selected 行和回调:
.directive('stSelectRowCustom', function () {
return {
restrict: 'A',
require: '^stTable',
scope: {
row: '=stSelectRowCustom',
callback: '&stSelected' // ADDED THIS
},
link: function (scope, element, attr, ctrl) {
var mode = attr.stSelectMode || 'single';
element.bind('click', function ($event) {
scope.$apply(function () {
ctrl.select(scope.row, mode, $event.shiftKey);
scope.callback(); // AND THIS
});
});
scope.$watch('row.isSelected', function (newValue) {
if (newValue === true) {
element.addClass('st-selected');
} else {
element.removeClass('st-selected');
}
});
}
};
});
我使用它如下:
<table st-table="displayedRowCollection" st-safe-src="rowCollection" class="table table-striped" >
<thead>
<tr>
<th>first name</th>
<th>last name</th>
<th>birth date</th>
<th>balance</th>
<th>email</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in rowCollection" st-select-row-custom="row" st-select-mode="single">
<td>{{row.firstName}}</td>
<td>{{row.lastName}}</td>
<td>{{row.birthDate | date:'shortDate'}}</td>
<td>{{row.balance}}</td>
<td>{{row.email}}</td>
</tr>
</tbody>
</table>
我需要 st-safe-src
因为我正在使用过滤器并且我的 rowCollection
会动态变化。
控制器代码如下:
controller('mainCtrl', ['$scope',
function ($scope) {
$scope.rowCollection = [
{firstName: 'Laurent', lastName: 'Renard', birthDate: new Date('1987-05-21'), balance: 102, email: 'whatever@gmail.com'},
{firstName: 'Blandine', lastName: 'Faivre', birthDate: new Date('1987-04-25'), balance: -2323.22, email: 'oufblandou@gmail.com'},
{firstName: 'Francoise', lastName: 'Frere', birthDate: new Date('1955-08-27'), balance: 42343, email: 'raymondef@gmail.com'}
];
$scope.rowCollection[0].isSelected = true;
}
])
正如你从上面看到的,我 select 第一行是:$scope.rowCollection[0].isSelected = true;
它确实显示 selected 在 table 中,但是当我点击另一行时, 第一行保持 selected 直到我点击它。当我 select 另一行(现在两行是 selected)然后 select 第一行时,两行都是未selected。否则指令按预期工作。
有一个 plunkr 的工作示例:http://plnkr.co/edit/N9jw6B?p=preview
提前谢谢你。
更新 1:
通过查看源代码 here 我可以看到 smart-table 跟踪 last-selected
行并在下一个 selection 上取消 selecting 它,所以当我传递带有 PRE-selected 行的数组,lastSelected
未定义,不能取消 selected。至少我知道这种行为的原因,现在正在尝试构建一个自定义指令,它将传递应该 selected 的默认行,感谢任何帮助。
if (lastSelected) {
lastSelected.isSelected = false;
}
lastSelected = row.isSelected === true ? row : undefined;
更新 2:
好的,我在这里找到了解决方案:
它有效,但我不太喜欢,因为将其视为 hack。仍在为更多 suitable 解决方案工作,该解决方案基于一个指令,我将向该指令传递行,默认情况下应为 selected。
鸭胶调试:)
这是我对这个问题的解决方案:
.directive('stDefaultValue', function () {
return {
restrict: 'A',
require: '^stTable',
scope: {
selectedRow: '=stDefaultValue',
stSafeSrc: '='
},
link: function (scope, element, attr, ctrl) {
scope.$watch('stSafeSrc', function(newValue, oldValue) {
if(typeof newValue !== 'undefined'){
ctrl.select(newValue[scope.selectedRow], 'single', false);
}
});
}
};
});
您应该按以下方式使用它:
<table st-table="displayedRowCollection"
st-default-value="1"
st-safe-src="rowCollection"
class="table table-striped" >
在这个例子中,我只传递了我想被选中的行的索引,在我的场景中这就足够了,但当然你可以传递任何 javascript 对象并稍加努力就可以将其选中。
您可以在此处查看工作示例:https://plnkr.co/edit/ca7xLv?p=preview
我使用带有默认 selection 的 Smart-Table 通过使用以下辅助指令来执行 selection,突出显示 selected 行和回调:
.directive('stSelectRowCustom', function () {
return {
restrict: 'A',
require: '^stTable',
scope: {
row: '=stSelectRowCustom',
callback: '&stSelected' // ADDED THIS
},
link: function (scope, element, attr, ctrl) {
var mode = attr.stSelectMode || 'single';
element.bind('click', function ($event) {
scope.$apply(function () {
ctrl.select(scope.row, mode, $event.shiftKey);
scope.callback(); // AND THIS
});
});
scope.$watch('row.isSelected', function (newValue) {
if (newValue === true) {
element.addClass('st-selected');
} else {
element.removeClass('st-selected');
}
});
}
};
});
我使用它如下:
<table st-table="displayedRowCollection" st-safe-src="rowCollection" class="table table-striped" >
<thead>
<tr>
<th>first name</th>
<th>last name</th>
<th>birth date</th>
<th>balance</th>
<th>email</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in rowCollection" st-select-row-custom="row" st-select-mode="single">
<td>{{row.firstName}}</td>
<td>{{row.lastName}}</td>
<td>{{row.birthDate | date:'shortDate'}}</td>
<td>{{row.balance}}</td>
<td>{{row.email}}</td>
</tr>
</tbody>
</table>
我需要 st-safe-src
因为我正在使用过滤器并且我的 rowCollection
会动态变化。
控制器代码如下:
controller('mainCtrl', ['$scope',
function ($scope) {
$scope.rowCollection = [
{firstName: 'Laurent', lastName: 'Renard', birthDate: new Date('1987-05-21'), balance: 102, email: 'whatever@gmail.com'},
{firstName: 'Blandine', lastName: 'Faivre', birthDate: new Date('1987-04-25'), balance: -2323.22, email: 'oufblandou@gmail.com'},
{firstName: 'Francoise', lastName: 'Frere', birthDate: new Date('1955-08-27'), balance: 42343, email: 'raymondef@gmail.com'}
];
$scope.rowCollection[0].isSelected = true;
}
])
正如你从上面看到的,我 select 第一行是:$scope.rowCollection[0].isSelected = true;
它确实显示 selected 在 table 中,但是当我点击另一行时, 第一行保持 selected 直到我点击它。当我 select 另一行(现在两行是 selected)然后 select 第一行时,两行都是未selected。否则指令按预期工作。
有一个 plunkr 的工作示例:http://plnkr.co/edit/N9jw6B?p=preview
提前谢谢你。
更新 1:
通过查看源代码 here 我可以看到 smart-table 跟踪 last-selected
行并在下一个 selection 上取消 selecting 它,所以当我传递带有 PRE-selected 行的数组,lastSelected
未定义,不能取消 selected。至少我知道这种行为的原因,现在正在尝试构建一个自定义指令,它将传递应该 selected 的默认行,感谢任何帮助。
if (lastSelected) {
lastSelected.isSelected = false;
}
lastSelected = row.isSelected === true ? row : undefined;
更新 2:
好的,我在这里找到了解决方案:
鸭胶调试:)
这是我对这个问题的解决方案:
.directive('stDefaultValue', function () {
return {
restrict: 'A',
require: '^stTable',
scope: {
selectedRow: '=stDefaultValue',
stSafeSrc: '='
},
link: function (scope, element, attr, ctrl) {
scope.$watch('stSafeSrc', function(newValue, oldValue) {
if(typeof newValue !== 'undefined'){
ctrl.select(newValue[scope.selectedRow], 'single', false);
}
});
}
};
});
您应该按以下方式使用它:
<table st-table="displayedRowCollection"
st-default-value="1"
st-safe-src="rowCollection"
class="table table-striped" >
在这个例子中,我只传递了我想被选中的行的索引,在我的场景中这就足够了,但当然你可以传递任何 javascript 对象并稍加努力就可以将其选中。
您可以在此处查看工作示例:https://plnkr.co/edit/ca7xLv?p=preview