2017-10-30 5 views
2

この質問は、類似したhereまたはhereとは少し異なります。私がしたいのは、ディレクティブ(またはコントローラー内)ではなく、「HTMLタグの内部を評価する」ことです。この説明は間違っているか分かりにくいですが、私はよりよい方法を見つけることができません。そこで、私は、説明のために、自己完結型のコードを作成しました。あなたは "xyz.html"としてコピーして過去と保存して、私が意味することを見ることができます。Angularjs:HTMLタグ内の式を評価してください

<!DOCTYPE html> 
 
<html ng-app="myApp"> 
 
    <head> 
 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.6/angular.min.js"></script> 
 
    <script> 
 
     'use strict'; 
 
     let app = angular.module('myApp', []); 
 
     app.controller('myCtrl', ['$scope', function ($scope) { 
 
     let d = DATA_TYPE; 
 
     let e = EDIT_TYPE; 
 
     $scope.tbContents = { 
 
      fields: [ 
 
      {name: 'name', dataType: d.text, editType: e.text, refs:[]}, 
 
      {name: 'catalog', dataType: d.text, editType: e.dropdown, refs: ['catalog1', 'catalog2', 'catalog3']}, 
 
      {name: 'status', dataType: d.int, editType: e.dropdown, refs: [1, 2, 3, 4]}], 
 
      rows: [ 
 
      {name: 'name1', catalog: 'catalog1', status: 1}, 
 
      {name: 'name2', catalog: 'catalog1', status: 1}, 
 
      {name: 'name3', catalog: 'catalog2', status: 2} 
 
      ] 
 
     }; 
 
     $scope.refNameKey = ''; 
 
     $scope.setRefNameKey = function(key) { 
 
      $scope.refNameKey = key; 
 
     }; 
 
     $scope.getRefByNameKey = function(key) { 
 
      let res = []; 
 
      for(let i = 0; i < $scope.tbContents.fields.length; i++) { 
 
      if($scope.tbContents.fields[i].name == key) { 
 
       return $scope.tbContents.fields[i].refs; 
 
      } 
 
      } 
 
     }; 
 
     }]); 
 

 
     app.filter('filterDropdown', function() { 
 
     return function (fields) { 
 
      let output = []; 
 
      for (let i = 0; i < fields.length; i++) { 
 
      if (fields[i].editType == EDIT_TYPE.dropdown) { 
 
       output.push(fields[i]); 
 
      } 
 
      } 
 
      return output; 
 
     }; 
 
     }); 
 

 
     const DATA_TYPE = { 
 
     int: 1, 
 
     text: 2, 
 
     //... 
 
     }; 
 

 
     const EDIT_TYPE = { 
 
     dropdown: 1, 
 
     test: 2, 
 
     //... 
 
     }; 
 
    </script> 
 
    </head> 
 

 
    <body> 
 
    <div ng-controller="myCtrl"> 
 
     <div> 
 
     <!--<p ng-repeat="field in tbContents.fields | filterDropdown"><a href="#" ng-click="refNameKey=field.name">{{field.name}}</a></p>--> 
 
     <p ng-repeat="field in tbContents.fields | filterDropdown"><a href="#" ng-click="setRefNameKey(field.name)">{{field.name}}</a></p> 
 
     </div> 
 
     <hr /> 
 
     <div ng-show = "refNameKey"> 
 
     <p ng-repeat = "ref in getRefByNameKey(refNameKey)">{{ref}}</p> 
 
     </div> 
 
    </div> 
 
    </body> 
 
</html>

私が欲しいのは、私がHTMLコード、refNameKey=field.name代わりのsetRefNameKey(field.name)にコメント行です。私はなぜrefNameKey=field.nameが動作しないのか分かりませんが、この簡単な作業のためにsetRefNameKey関数を作成するのは嫌です。

答えて

1

ng-repeatは、反復ごとに子スコープを作成します。したがって、refNameKey変数は各子スコープで作成され、親スコープのrefNameKeyを参照しません。あなたはこのようにそれを修正することによってこの問題を解決することができます

<p ng-repeat="field in tbContents.fields | filterDropdown"><a href="#" ng-click="$parent.refNameKey=field.name">{{field.name}}</a></p> 

Plunker:http://plnkr.co/edit/mcDvGqd6SFCfmqyfUNRc?p=preview

+0

グレート。出来た。知識のために@Vijayをありがとう。 – Oops

関連する問題