2016-06-15 13 views
0

anglejsを使用して自動的にデータを出力する際に​​問題があります。角度のクールな機能の1つは、双方向データバインディングです。入力をjsonファイルでバインドすることができません。私がしようとしているのは、ユーザー入力が双方向データバインディングを使用して、キー、出力キーと自動的に一致するかどうかです。ユーザーが選択を削除すると、出力またはビューも変更されます。正しい結果が得られるようにボタンng-clickディレクティブを使用しています。どんな助けもありがとう。AngularJS双方向データバインディング入力と一致するjsonファイル

私がしようとしていること: 1.if入力がjson情報を含むリンクと一致する場合、その情報を双方向データバインディングを使用して自動的に出力します。情報を得るためには、ボタンをクリックしないでください。 3.ユーザー入力を削除すると、出力データも削除されます。

<!DOCTYPE html> 
    <html lang="en" ng-app="app"> 
    <head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script> 
<meta charset="UTF-8"> 
<title>Pokedex</title> 
<!--Angular STYLE SHEET--> 
<link rel="stylesheet" href="Content/angular-material.min.css" /> 



</head> 
<body ng-controller="ctrl"> 
<md-toolbar class="md-padding"> 
    <div class="md-toolbar-tools"> 
     <h1 class="md-flex"><strong> Angular DM</strong></h1> 
    </div> 
    <md-nav-bar nav-bar-aria-label="navigation links"> 
     <a href="index.html">Movie Database</a> 
     <a href="input_Control.html">Pokedex</a> 
    </md-nav-bar> 
    <!--INPUT--> 


      <input ng-model="search" type="text" placeholder="Enter Pokemon Name" ng-click="deleting()"> 
      <button ng-click="findValue(search)">Search</button> 
      <span> {{search | lowercase}}</span> 


    <div> 
     <table> 
      <tr> 
       <th>No.</th> 
       <th>Name</th> 
       <th>Image</th> 
      </tr> 
      <tr ng-repeat="x in results"> 
       <td></td> 
       <td ng-model="key"> 
        {{ $index+1 + x.Name | lowercase}} 
       </td> 
       <td> 
        <img ng-model="image" ng-src="{{x.Image}}"> 
       </td> 
      </tr> 
     </table> 
    </div> 
    <script> 
     var app = angular.module('app', []); 
     app.controller('ctrl', function ($scope, $http) { 
      $http.get("https://raw.githubusercontent.com/dmedina0217/pokedex/master/pokemon-images.json").then(function (response) { 
       $scope.images = response.data; 
       $scope.results = []; 
       $scope.findValue = function (search) { 

        angular.forEach($scope.images, function (value, key) { 
         if (key === search) { 
          $scope.results.push({ Name: key, Image: value }).$filter(lowercase); 

         } 
        }); 
       }; 
       $scope.deleting = function() { 
        $scope.search = null; 

       } 
      }); 


     }); 
    </script> 
    <!-- Angular Material Script START--> 
    <script src="scripts/angular.min.js"></script> 
    <script src="scripts/angular-animate.min.js"></script> 
    <script src="scripts/angular-aria.min.js"></script> 
    <script src="scripts/angular-messages.min.js"></script> 
    <script src="scripts/angular-material/angular-material.min.js"></script> 
    <!-- Angular Material Script END--> 

答えて

0

あなたの要件に完全に従ってください。 @yourrockによって与えられるもう1つの答えは、jsonのセットでの単なるフィルタであり、その2方向バインディングではありません。

<!DOCTYPE html> 
<html lang="en" ng-app="app"> 

<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script> 
    <meta charset="UTF-8"> 
    <title>Pokedex</title> 



</head> 

<body ng-controller="ctrl"> 
    <md-toolbar class="md-padding"> 
    <div class="md-toolbar-tools"> 
     <h1 class="md-flex"><strong> Angular DM</strong></h1> 
    </div> 
    <md-nav-bar nav-bar-aria-label="navigation links"> 
     <a href="index.html">Movie Database</a> 
     <a href="input_Control.html">Pokedex</a> 
    </md-nav-bar> 
    <!--INPUT--> 


    <input ng-model="search" type="text" placeholder="Enter Pokemon Name" data-ng-change="findValue(search)" ng-keydown="removeTagOnBackspace($event)" ng-click="deleting()"> 
    <!-- <button ng-change="findValue(search)">Search</button> --> 
    <span> {{search | lowercase}}</span> 


    <div> 
     <table> 
     <tr> 
      <th>No.</th> 
      <th>Name</th> 
      <th>Image</th> 
     </tr> 
     <tr ng-repeat="x in results"> 
      <td></td> 
      <td ng-model="key"> 
      {{ x.Name | lowercase}} 
      </td> 
      <td> 
      <img ng-model="value" ng-src="{{x.Image}}"> 
      </td> 
     </tr> 
     </table> 
    </div> 

    <script> 
     var app = angular.module('app', []); 
     app.controller('ctrl', function($scope, $http) { 



     $scope.getResult=function(){ 
     $http.get("https://raw.githubusercontent.com/dmedina0217/pokedex/master/pokemon-images.json").then(function(response) { 
      $scope.images = response.data; 
      console.log($scope.images) 

      $scope.results = []; 



      $scope.findValue = function(search) { 

      angular.forEach($scope.images, function(value, key) { 
       debugger 
       if (key == search) { 
       $scope.results.push({ 
        Name: key, 
        Image: value 
       }).$filter(lowercase); 

       } 


      }); 
      console.log($scope.results) 
      }; 
      $scope.removeTagOnBackspace = function (event) { 
    if (event.keyCode === 8) { 
    $scope.results=[]; 

     console.log('here!'); 
    } 
}; 
      $scope.deleting = function() { 
      $scope.search = null; 

      } 
     }); 

} 
$scope.getResult(); 
     }); 
    </script> 
    </body> 
    </html> 
1

私はここで注意したい点がいくつかあります。まず、plunker:https://plnkr.co/edit/IgcuE2fKlqPcT9ZV9GQ5

  • あなたのスクリプト/ CSSの参照は、相対パスを指したので、私はちょうどあなたがplunkerから使用するライブラリの最新バージョンをつかみました。あなたが見ているものは、あなたが見たいものではないかもしれませんが、それはあなたが提供したものから得られる最高のものです。
  • ポケモンリストを含むレスポンスはオブジェクトであり、配列ではありません。 ng-repeatでオブジェクトを反復処理できますが、オブジェクトに対してfilter指示文を使用することはできません。したがって、findValueメソッドを変更して、ng-repeatとともに使用する新しい配列を作成しました。配列をフィルタリングするためにfilter: search指示文を使用できるので、私はif (key === search)チェックを削除しました。この検索は即座に行われ、入力ボックスの値が変更されるとすぐに実行されます。
  • ng-modelは、input,selectおよびtextareaにのみバインドされているので、<td>に付いている点はありません。ここをクリックしてください:https://docs.angularjs.org/api/ng/directive/ngModel
  • あなたは#3であなたが何を意味するのか分かりません。 results配列を空にしたい場合は、メソッド内に$scope.results = []と設定すればいいです。
関連する問題