输入的 ng-model 和 ng-change 都会改变 $scope 状态——哪个优先
Both ng-model and ng-change on input alter the $scope state - which one takes priority
我有以下对象数组
$scope.client.systemAssessments = [
{
id: 0,
name: 'Name 1',
paused: false
},
{
id: 1,
name: 'Name 2',
paused: false
},
]
然后我为每个评估渲染一些 HTML:
<div ng-repeat="systemAssessment in client.systemAssessments">
<span class="switch">
<input ng-model="systemAssessment.paused" name="{{systemAssessment.name}}" ng-change="onPauseResumeAssessmentHandler(systemAssessment)" type="checkbox" toggle-btn on-type="success">
</span>
</div>
我的 ng-change 函数如下所示:
$scope.onPauseResumeAssessmentHandler = function onPauseResumeAssessmentHandler(systemAssessment) {
//const { id, paused } = systemAssessment;
//const clientId = $scope.client.clientId;
console.log(systemAssignedAssessment);
try {
throw new Error('ERROR');
//AssessmentsService.pauseResumeAssessment(clientId ,id, !paused);
} catch (error) {
$scope.client.systemAssessments[0].paused = false;
console.log($scope.client.systemAssessments);
}
};
现在,由于我的输入复选框绑定到 pausedAssessment.paused
,如果我选中它,暂停的 属性 变为 true 并且复选框被选中,但是,我只希望它在 AssessmentsService.pauseResumeAssessment(clientId ,id, !paused);
不会失败,因为它是一个 POST 请求。
例如,如果未选中该复选框而我单击了它,我希望它仅检查 POST 请求是否通过,并让它保持未选中状态,或者在POST请求失败。
正如您在我的代码片段中看到的那样,我尝试使用 try-catch 块,然后在 POST 请求抛出错误时取消选中第一个复选框,但是,当我记录 $scope.client.systemAssessments
在catch中,它显示第一个评估的暂停属性仍然设置为true,尽管你可以看到我将它设置为false。
我假设这是因为 ng-model 和 ng-change 之间的奇怪交互(可能 ng-model 覆盖了我在 ng-change 中所做的更改)
做正确的事。当未选中的复选框被点击时,它会被选中——不要反对它。但是勾选后,你可以取消勾选:
... ng-change:
if (smth.paused) {
try {
throw new Error('ERROR');
} catch (error) {
$timeout(() => { // Can not and should not be done immediately
smth.paused = false;
})
}
}
我有以下对象数组
$scope.client.systemAssessments = [
{
id: 0,
name: 'Name 1',
paused: false
},
{
id: 1,
name: 'Name 2',
paused: false
},
]
然后我为每个评估渲染一些 HTML:
<div ng-repeat="systemAssessment in client.systemAssessments">
<span class="switch">
<input ng-model="systemAssessment.paused" name="{{systemAssessment.name}}" ng-change="onPauseResumeAssessmentHandler(systemAssessment)" type="checkbox" toggle-btn on-type="success">
</span>
</div>
我的 ng-change 函数如下所示:
$scope.onPauseResumeAssessmentHandler = function onPauseResumeAssessmentHandler(systemAssessment) {
//const { id, paused } = systemAssessment;
//const clientId = $scope.client.clientId;
console.log(systemAssignedAssessment);
try {
throw new Error('ERROR');
//AssessmentsService.pauseResumeAssessment(clientId ,id, !paused);
} catch (error) {
$scope.client.systemAssessments[0].paused = false;
console.log($scope.client.systemAssessments);
}
};
现在,由于我的输入复选框绑定到 pausedAssessment.paused
,如果我选中它,暂停的 属性 变为 true 并且复选框被选中,但是,我只希望它在 AssessmentsService.pauseResumeAssessment(clientId ,id, !paused);
不会失败,因为它是一个 POST 请求。
例如,如果未选中该复选框而我单击了它,我希望它仅检查 POST 请求是否通过,并让它保持未选中状态,或者在POST请求失败。
正如您在我的代码片段中看到的那样,我尝试使用 try-catch 块,然后在 POST 请求抛出错误时取消选中第一个复选框,但是,当我记录 $scope.client.systemAssessments
在catch中,它显示第一个评估的暂停属性仍然设置为true,尽管你可以看到我将它设置为false。
我假设这是因为 ng-model 和 ng-change 之间的奇怪交互(可能 ng-model 覆盖了我在 ng-change 中所做的更改)
做正确的事。当未选中的复选框被点击时,它会被选中——不要反对它。但是勾选后,你可以取消勾选:
... ng-change:
if (smth.paused) {
try {
throw new Error('ERROR');
} catch (error) {
$timeout(() => { // Can not and should not be done immediately
smth.paused = false;
})
}
}