Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS还原嵌套在ng repeat on dialog cancel中的控件的选定值_Javascript_Angularjs_Angularjs Ng Repeat_Angularjs Ng Model_Angularjs Ng Init - Fatal编程技术网

Javascript AngularJS还原嵌套在ng repeat on dialog cancel中的控件的选定值

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

取消确认对话框后,我想还原选择标记值,该标记值位于ng repeat

以下是我到目前为止的情况:

相关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>
$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}”)也可以工作,但我不需要也永远不会这样做。您的解决方案按预期工作。谢谢@荷兰可以自由编辑答案:)我将接受编辑,然后更新值(我在确认对话框之前选择的值设置为当前值)。我想要的是将此值还原为以前选择的值。