2017-10-30 2 views
2

Beachten Sie, dass sich diese Frage ein wenig von der ähnlichen Nachricht unterscheidet here oder here. Was ich tun möchte, ist "innerhalb des HTML-Tags zu evaluieren", nicht innerhalb einer Direktive (oder im Controller). Diese Beschreibung kann falsch oder schwer zu verstehen sein, aber ich kann keinen besseren Weg finden; Also habe ich den in sich geschlossenen Code zur Veranschaulichung gemacht. Sie können kopieren und Vergangenheit und speichern als "xyz.html" und sehen, was ich meine.Angularjs: Ausdruck im HTML-Tag auswerten

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

Was ich will, ist die Linie, die ich in den HTML-Code kommentiert, refNameKey=field.name statt setRefNameKey(field.name). Ich weiß nicht, warum refNameKey=field.name nicht funktioniert, aber ich mag es nicht, die setRefNameKey Funktion für diese einfache Aufgabe zu erstellen.

Antwort

1

ng-repeat erstellt für jede Iteration einen Kindbereich. Daher wird Ihre refNameKey-Variable in jedem untergeordneten Bereich erstellt und bezieht sich nicht auf refNameKey im übergeordneten Bereich. Sie können dieses Problem beheben, indem es wie folgt ändern:

<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

Großen. Es funktionierte. Vielen Dank @Vijay für das Wissen. – Oops