javascript - AngularJS 在对话框取消时恢复嵌套在 ng-repeat 中的控件的选定值

标签 javascript angularjs angularjs-ng-repeat angularjs-ng-model angularjs-ng-init

我想在取消确认对话框后还原 ng-repeat 中的 select 标记值。

这是我目前所拥有的:

相关 HTML:

<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>

Javascript 逻辑:

$scope.selectionChanged = function(application, previousVersion) {
  var dialog = confirm('Change version?');

  if (dialog) {
    console.log('change version confirmed');
  } else {
    application.selectedVersion = previousVersion;
  }
};

'{{application.selectedVersion}}' 传递给函数而不是 application.selectedVersion 传递先前选择的值而不是当前值(此处解释:https://stackoverflow.com/a/45051464/2596580) .

当我更改选择值、执行对话框交互并取消它时,我尝试通过设置 application.selectedVersion = angular.copy(previousVersion); 来恢复该值。我可以通过调试 javascript 看到该值是正确的,但选择输入设置为空白而不是实际值。

我做错了什么?

JSFiddle 演示:https://jsfiddle.net/yt4ufsnh/

最佳答案

你必须在你的实现中纠正一些事情

  1. 当您将 '{{application.selectedVersion}}' 传递给 selectionChanged 方法时,它变成原始的 string。当您重新分配回 application.selectedVersion 时,您必须首先使用 JSON.parsepreviousVersion 解析为 JSON > 方法
  2. ng-options 集合上使用 track by apk.id。这是必需的,因为 JSON 解析的对象不被识别为用于构建选择的对象的同一实例,因此这就像覆盖内部 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;
    }
};

Updated Fiddle

关于javascript - AngularJS 在对话框取消时恢复嵌套在 ng-repeat 中的控件的选定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319335/

相关文章:

javascript - 获取关联数组中当前函数的键

javascript - 以 Angular 限制同时异步 $http get 请求

javascript - 如何在 Angularjs 应用程序中删除数组中的元素

javascript - 使用下拉列表使用 json 中的数据填充表

javascript - 仅在 HTML 中使用逻辑突出显示 ng-repeat 中的选定行

javascript - 如何根据最大编号对 ID 列表进行分组?

javascript - 如果 React Native 中没有互联网连接,则获取存储数据

Javascript 检查产量支持

css - Angular UI Bootstrap 日期选择器宽度问题

javascript - 使用 Bootstrap Glyphicons 创建复选框功能