web-dev-qa-db-ja.com

angular jsのng-repeat値を更新する方法は?

angular jsを初めて使用し、ng-repeatディレクティブを介してループしている配列があり、配列内の値をコピー、削除、および編集するためのコードを記述しました。

削除またはコピーしたい場合は、それを行うことができますか?しかし、[編集]をクリックすると、ポップアップボックスが1つ表示されます。これらの更新された値は、配列内で更新する必要があります。

どうすればそれを行うことができますか?

<!doctype html>
<html>
<head>
 <title>Angular app</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular.min.js">
  </script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<style type="text/css">
  .listv{
     margin-bottom: 30px;
  }
  .editpopup{
     width: 250px;
     height: 250px;
     border: 1px solid black;
     display: none;
     position: absolute;
     top: 0px;
     left: 0px;
     bottom: 0px;
     right: 0px;

     background-color:gray;
  }
  .editpopup-true{
     display: block;
  }
  .editpopup-false{
     display: none;
  }
  </style>
</head>
 <body ng-app="myApp">
    <div ng-controller="myCon">
     <div ng-repeat="s in items" class="listv">
        <span>{{s.id}}</span>
        <span>{{s.pname}}</span>
        <button ng-click="removeStudent($index)">remove</button>
        <button ng-click="copyrow($index)">copy</button>
        <button ng-click="editrow($index)">edit</button>
     </div></br>

     <div class="editpopup editpopup-{{istrue}} ">
        <p>edit id:<input type="text" ng-model="editedid"></p>
        <p>edit pname:<input type="text" ng-model="editedname"></p>
        <button ng-click="save($index)">save</button>
        <button ng-click="closepopup()">cancel</button>
     </div>

  </div>            
      var myApp=angular.module('myApp',[]);
      myApp.controller('myCon',function($scope){
      $scope.items=[{id:1,pname:'box1'},{id:2,pname:'box2'}, {id:3,pname:'box3'}];

    $scope.removeStudent=function($index){
      $scope.items.splice($index,1);
    }
  $scope.copyrow=function($index){

     $scope.len=$scope.items.length;
     $scope.ids=$scope.items[$index].id;
     $scope.pnames=$scope.items[$index].pname

     $scope.items.Push({
          id:$scope.len+1,
          pname:$scope.pnames 
      });
  }
  $scope.editrow=function($index){
     $scope.istrue=true;
     $scope.editedid=$scope.items[$index].id;
     $scope.editedname=$scope.items[$index].pname;
  }
  $scope.closepopup=function(){
     $scope.istrue=false;

  }
  $scope.save=function($index){
     $scope.istrue=false;
     $scope.s.name=$scope.editedname;
  }
 });

ここに jsfiddle

6
Dileep

最も簡単な方法は、 angular.copy を使用して、編集をクリックしたときにオブジェクトのクローンを作成し、保存をクリックしたときにデータを配列内のアイテムにコピーすることです。

最初に$scope.editedItemを初期化します

$scope.editedItem = {};

editrowの場合、現在編集されているインデックスを$ indexに保存してから、データを$scope.editedItemに複製します。

$scope.editrow = function($index){
    $scope.istrue = true;
    $scope.$index = $index;
    angular.copy($scope.items[$index], $scope.editedItem);
}

次に、saveで、データを配列内のオブジェクトに複製します。

$scope.save = function(){
    $scope.istrue = false;
    angular.copy($scope.editedItem, $scope.items[$scope.$index]) 
}

代わりにeditedItemを使用するには、ビューを更新する必要があります。

<div class="editpopup editpopup-{{istrue}} ">
    <p>edit id:<input type="text" ng-model="editedItem.id"></p>
    <p>edit pname:<input type="text" ng-model="editedItem.pname"></p>
    <button ng-click="save()">save</button>
    <button ng-click="closepopup()">cancel</button>
 </div>

JsFiddle

14
Wayne Ellery

私はこれと同じ問題を抱えていました。これが私の修正でした


オブジェクトを更新しなかった元のコード

<div class="info" ng-repeat="email in vm.contactData.emails.other">
      <input type="text" ng-model="email" />
</div> 

アイテム$ indexを使用して適切にバインドしました

<div class="info" ng-repeat="email in vm.contactData.emails.other">
      <input type="text" ng-model="vm.contactData.emails.other[$index]" />
</div> 

このバインディングは、配列内の更新されたアイテムが以前その場所にあった同じアイテムを参照しているかどうかがわからないため、再描画の問題を引き起こします。これを修正するには、配列のフォーマットを少し変更する必要がありました。

['[email protected]','[email protected]']

になります

[
   {'email': '[email protected]'},
   {'email': '[email protected]'}
]

そして

<div class="info" ng-repeat="email in vm.contactData.emails.other">
     <input type="text" ng-model="vm.contactData.emails.other[$index]" />
</div> 

になります

<div class="info" ng-repeat="email in vm.contactData.emails.other">
      <input type="text" ng-model="vm.contactData.emails.other[$index].email" />
</div> 

これらの変更後、入力フィールドがフォーカスを失うような再描画の問題が発生することなく、適切にバインドできるはずです。

3
Jimmy Miller

最初に変数$scope.getIndex=0;を宣言し、[保存]ボタンをクリックしたときにitems配列からインデックスを取得します。次に、その変数に$indexを割り当てます。

これで、コントローラーのどこからでもitems[$scope.getIndex]を取得できます。そして、items配列を更新するのに役立ちます:

$scope.getIndex=0;
$scope.editrow=function($index){
     $scope.getIndex=$index;
     $scope.istrue=true;
     $scope.editedid=$scope.items[$index].id;
     $scope.editedname=$scope.items[$index].pname;
}

$scope.save=function($index){
    $scope.istrue=false;
    $scope.items[$scope.getIndex].id=$scope.editedid;
    $scope.items[$scope.getIndex].pname=$scope.editedname;
}[enter link description here][1]


JSFiddle

0
S.Elavarasan

まず、次のように古い値を保存します。

$scope.editrow=function($index){
    $scope.istrue=true;
    $scope.oldValue = $scope.items[$index].id; // save the old id
    $scope.editedid=$scope.items[$index].id;
    $scope.editedname=$scope.items[$index].pname;
};

次に、保存するときに、古い値を使用して適切なオブジェクトを見つけ、次のように新しい値を割り当てます。

$scope.save=function($index){
    $scope.istrue=false;
    $scope.items.forEach(function (item) {
       if(item.id == $scope.oldValue){
           item.id = $scope.editedid;
           item.pname = $scope.editedname;
       }
    });
};

JsFiddle

0