Javascript AngularJS还原嵌套在ng repeat on dialog cancel中的控件的选定值
取消确认对话框后,我想还原选择标记值,该标记值位于ng repeat中 以下是我到目前为止的情况: 相关HTML:Javascript AngularJS还原嵌套在ng repeat on dialog cancel中的控件的选定值,javascript,angularjs,angularjs-ng-repeat,angularjs-ng-model,angularjs-ng-init,Javascript,Angularjs,Angularjs Ng Repeat,Angularjs Ng Model,Angularjs Ng Init,取消确认对话框后,我想还原选择标记值,该标记值位于ng repeat中 以下是我到目前为止的情况: 相关HTML: <table> <tbody> <tr ng-repeat="application in rows"> <td> <select ng-model="application.selectedVersion" ng-optio
<table>
<tbody>
<tr ng-repeat="application in rows">
<td>
<select
ng-model="application.selectedVersion"
ng-options="apk.versionName for apk in application.versions | orderBy : 'id' : true"
ng-init="application.selectedVersion=application.versions.filter(currentVersion, application.apkUpdates)[0]"
ng-change="selectionChanged(application, '{{application.selectedVersion}}')"
style="padding:0 1em;" />
</td>
</tr>
</tbody>
</table>
$scope.selectionChanged = function(application, previousVersion) {
var dialog = confirm('Change version?');
if (dialog) {
console.log('change version confirmed');
} else {
application.selectedVersion = previousVersion;
}
};
将'{application.selectedVersion}}}
传递给函数而不是应用程序。selectedVersion
传递以前选择的值而不是当前值(此处解释:)
当我更改选择值时,执行对话框交互并取消它,我尝试通过设置application.selectedVersion=angular.copy(previousVersion)还原该值代码>。通过调试javascript,我可以看到该值是正确的,但是select输入被设置为空白,而不是实际值
我做错了什么
jsiddle演示:您必须在实现中纠正几件事
当您将{{application.selectedVersion}}
传递给selectionChanged
方法时,它将成为原始字符串
。当您重新分配回应用程序.selectedVersion
时,您必须首先使用JSON.parse
方法将previousVersion
解析为JSON
在ng选项
collection上使用track by apk.id
。这是必需的,因为JSON解析的对象没有被识别为用于构建select的对象的同一实例,因此这就像重写一个内在的equals
函数以仅使用其id属性一样
最终版本
ng-options="apk.versionName for apk in (application.versions |
orderBy : 'id' : true) track by apk.id"
代码
$scope.selectionChanged = function(application, previousVersion) {
var dialog = confirm('Change version?');
if (dialog) {
console.log('change version confirmed');
} else {
application.selectedVersion = previousVersion ? JSON.parse(previousVersion) : null;
}
};
如果您只需从javascript代码中删除else条件,就可以实现所需的行为
您的最终代码应该是:
$scope.selectionChanged = function(application, previousVersion) {
var dialog = confirm('Change version?');
if (dialog) {
console.log('change version confirmed');
}
};
这适用于在选择输入上实际设置值,但它设置的是当前值。我想要的是设置上一个值(即取消ng change update以查看)。我编辑了这个问题来澄清这个细节。@Netherdan你能看看更新的答案吗?当我注意到你的更新时,我发布了同样的答案。这是因为JSON解析的对象不等于用于构建select的对象(即JSON.parse(previousVersion)==application.versions[previousVersionIndex]
返回false),因此它无法将其识别为同一实例。trackby
子句强制通过id值跟踪对象,因此即使是原始的JSON.parse(“{id:x}”)也可以工作,但我不需要也永远不会这样做。您的解决方案按预期工作。谢谢@荷兰可以自由编辑答案:)我将接受编辑,然后更新值(我在确认对话框之前选择的值设置为当前值)。我想要的是将此值还原为以前选择的值。