2017-10-06 14 views
7

मेरी निम्नलिखित कोणीय आवेदन में, मैं (input से अधिक टैग कोणीय निर्देश आवरण) myelement की कई पंक्तियां। एक समय में मुझे इसमें से किसी एक को ध्यान केंद्रित/चयन/हाइलाइट करने की आवश्यकता है, शैलियों में .selected वर्ग ऐसा करता है।कोणीय बाँध वर्ग ध्यान केंद्रित

निम्नलिखित अनुप्रयोग में, input टैग पर ध्यान केंद्रित करने के अलावा सब कुछ ठीक काम करता है, जिसे सीएसएस कक्षा selected द्वारा बाध्य करने की आवश्यकता है। अर्थात। जो भी तत्व वर्ग selected संबंधित input टैग केंद्रित होना चाहिए। मैं इसे कैसे प्राप्त कर सकता हूं?

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title></title> 
    <meta name="description" content=""> 
    <meta name="viewport" content="width=device-width"> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 
    <style> 
    .container { 
     display: flex; 
     flex-direction: column; 
     width: 600px; 
    } 
    .notebook { 
     display: flex; 
     justify-content: center; 
    } 
    .cell { 
     margin: 5px; 
     padding: 5px; 
    } 
    .selected { 
     border-style: solid; 
     border-color: green; 
     border-width: 1px; 
     border-left-width: 5px; 
    } 
    </style> 
</head> 

<body ng-app="myApp"> 

<div ng-controller="ListController as listctrl" class="notebook"> 

    <div class="container"> 
    <myelement ng-repeat="i in listctrl.list" 
     ng-click="listctrl.selected = $index" 
     ng-class="{selected : listctrl.selected === $index}" 
     class="cell"></myelement> 
    </div> 
</div> 

<script type="text/javascript"> 
angular 
    .module('myApp',[]) 
    .controller('ListController', function($scope) { 
    var listctrl = this; 
    listctrl.list = []; 
    listctrl.selected = 0; 

    listctrl.addCell = function() { 
     var x = listctrl.list.length; 
     listctrl.list.push(x); 
     listctrl.selected = listctrl.list.length - 1; 
    } 

    listctrl.addCell(); 

    $scope.$on('add', function (event, message) { 
     $scope.$apply(listctrl.addCell); 
    }); 

    $scope.$on('keyUp', function(event) { 
     $scope.$apply(function(){ 
     listctrl.selected = listctrl.selected - 1; 
     }); 
    }); 

    $scope.$on('keyDown', function(event) { 
     $scope.$apply(function(){ 
     listctrl.selected = listctrl.selected + 1; 
     }); 
    }); 
    }) 
    .directive('myelement', function($rootScope){ 

    return { 
     template: '<input style="width: 95%"></input>', 
     restrict: 'E', 
     link: function (scope, element, attrs) { 

     var inputTag = element[0].children[0]; 
     inputTag.focus(); 

     element.on('keydown', function(event) { 
      if (event.keyCode === 13 && event.shiftKey) { 
      $rootScope.$broadcast('add'); 
      } else if (event.keyCode === 38) { 
      $rootScope.$broadcast('keyUp'); 
      } else if (event.keyCode === 40) { 
      $rootScope.$broadcast('keyDown'); 
      } 
     }); 
     }, 
     controller: function ($scope) { 

     } 
    }; 
    }) 
</script> 

</body> 
</html> 
+0

एनजी-श्रेणी = "{चयनित: listctrl.selected === $ अनुक्रमणिका}" होना चाहिए "?" चयनित और listctrl के बीच में। यह एक टर्नरी के बाद से चुना गया है? या मैं इसे गलत पढ़ रहा हूँ। –

+1

@Dream_Cap यह एक टर्नरी नहीं है, केवल एक ऑब्जेक्ट शाब्दिक – Phil

+0

क्या आप 'element.hasClass ('चयनित') और inputTag.focus()' जैसे कुछ का उपयोग नहीं कर सकते? आपको अपने निर्देश की 'प्राथमिकता' को '0' से अधिक कुछ सेट करने की आवश्यकता हो सकती है, इसलिए उसका पोस्ट-लिंक फ़ंक्शन' ngClass' के बाद चलता है – Phil

उत्तर

4

निम्नलिखित उदाहरण पर विचार करें। यह अब AngularJS (v1.5 के बाद से) की अनुशंसित component सुविधा का उपयोग करता है। उदाहरण बहुत आसान है ताकि आप आसानी से समझ सकें कि क्या हो रहा है और इसे अपनी परियोजना में कैसे लागू किया जाए।

जावास्क्रिप्ट

class MainController { 

    constructor() { 
     this.focused = true; 
    } 

} 

class MyElementController { 

    constructor($element) { 
     this.$element = $element; 
    } 

    $onChanges(changes) { 
     if (changes.focused.currentValue === true) { 
      this.$element[0].getElementsByTagName('input')[0].focus(); 
     } 
    } 

} 

const myElementComponent = { 
    bindings: { 
     focused: '<' 
    }, 
    controller: MyElementController, 
    template: `<input type="text">` 
}; 

angular 
    .module('app', []) 
    .controller('MainController', MainController) 
    .component('myElement', myElementComponent); 

एचटीएमएल

<body ng-app="app" ng-controller="MainController as vm"> 
    <my-element focused="vm.focused"></my-element> 
</body> 
4

var elementComponent = { 
 
bindings:{ 
 
    selected:'<' 
 
    }, 
 
    controller:function($element){ 
 
    this.$onChanges = function(changes) { 
 
     if(changes.selected.currentValue){ 
 
     $element[0].getElementsByClassName('textName')[0].focus() 
 
     } 
 
    } 
 
    }, 
 
    template:'<input type="text" class="textName" style="margin:4px">' 
 
}; 
 

 
var controller = function(){ 
 
    this.list = [1]; 
 
    this.selected = 1 
 
    this.add = function(){ 
 
    var length = this.list.length ; 
 
     this.list.push(length + 1); 
 
     this.selected = length + 1; 
 
    } 
 
}; 
 

 

 
angular.module('app', []) 
 
     .component('element', elementComponent) 
 
     .controller('appCtrl', controller);
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
</head> 
 
<body ng-app="app" ng-controller="appCtrl as vm" > 
 
<script src="https://rawgit.com/angular/bower-angular/master/angular.min.js"></script> 
 
    <button ng-click="vm.add()">Add New Cell</button> 
 
    <div ng-repeat="item in vm.list" > 
 
    <element selected="item == vm.selected" ng-click="vm.selected = item"></element> 
 
    </div> 
 
    Selected Element : {{vm.selected}} 
 
</body> 
 
</html>

यह आपकी आवश्यकता को भरने कर सकते हैं।

1

प्रत्येक कुंजी अप/किए गए पर, कक्षा की जांच करें, और इनपुट राज्यों को बदलने के लिए फोकस(), धुंध() का उपयोग करें। टैब प्रेस, preventDefault() के मामले में

angular 
 
    .module('myApp',[]) 
 
    .controller('ListController', function($scope) { 
 
    var listctrl = this; 
 
    listctrl.list = ['1','2','3']; 
 
    listctrl.selected = 0; 
 

 
    listctrl.addCell = function() { 
 
     var x = listctrl.list.length; 
 
     listctrl.list.push(x); 
 
     listctrl.selected = listctrl.list.length - 1; 
 
    } 
 

 
    listctrl.addCell(); 
 

 
    $scope.$on('add', function (event, message) { 
 
     $scope.$apply(listctrl.addCell); 
 
    }); 
 

 
    $scope.$on('keyUp', function(event) { 
 
     $scope.$apply(function(){ 
 
     listctrl.selected = listctrl.selected - 1; 
 
     }); 
 
    }); 
 

 
    $scope.$on('keyDown', function(event) { 
 
     $scope.$apply(function(){ 
 
     listctrl.selected = listctrl.selected + 1; 
 
     }); 
 
    }); 
 
    }) 
 
    .directive('myelement', function($rootScope){ 
 
    return { 
 
     template: '<input style="width: 95%"></input>', 
 
     restrict: 'E', 
 
     scope: {}, 
 
     link: function (scope, element, attrs) { 
 
     var inputTag = element[0].children[0]; 
 
     var updateFocues = function(element) { 
 
      if(element[0].className.indexOf('selected') !== -1) { 
 
      scope.$apply(function() { 
 
       inputTag.focus() 
 
      }); 
 
      } else { 
 
      scope.$apply(function() { 
 
       inputTag.blur() 
 
      }); 
 
      }  
 
     } 
 

 
     element.on('keydown', function(event) { 
 
      if (event.keyCode === 13 && event.shiftKey) { 
 
      $rootScope.$broadcast('add'); 
 
      } else if (event.keyCode === 38) { 
 
      $rootScope.$broadcast('keyUp'); 
 
      } else if (event.keyCode === 40) { 
 
      $rootScope.$broadcast('keyDown'); 
 
      }else if (event.keyCode === 9) { 
 
      event.preventDefault(); 
 
      } 
 
     }); 
 
     
 

 
     scope.$on('keyUp', function() { 
 
      updateFocues(element) 
 
     }) 
 
     scope.$on('keyDown', function() { 
 
      updateFocues(element) 
 
     }) 
 
     }, 
 
     controller: function ($scope) { 
 

 
     } 
 
    }; 
 
    })
.container { 
 
     display: flex; 
 
     flex-direction: column; 
 
     width: 600px; 
 
    } 
 
    .notebook { 
 
     display: flex; 
 
     justify-content: center; 
 
    } 
 
    .cell { 
 
     margin: 5px; 
 
     padding: 5px; 
 
    } 
 
    .selected { 
 
     border-style: solid; 
 
     border-color: green; 
 
     border-width: 1px; 
 
     border-left-width: 5px; 
 
    }
<!doctype html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title></title> 
 
    <meta name="description" content=""> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 
 

 
</head> 
 

 
<body ng-app="myApp"> 
 

 
<div ng-controller="ListController as listctrl" class="notebook"> 
 

 
    <div class="container"> 
 
    <myelement ng-repeat="i in listctrl.list" 
 
     ng-click="listctrl.selected = $index" 
 
     ng-class="{selected : listctrl.selected === $index}" 
 
     class="cell"></myelement> 
 
    </div> 
 
</div> 
 
</body> 
 
</html>

0

सुझाएँ आप के बजाय सीएसएस का उपयोग करें (सबसे अधिक संभावना यह आपकी आवश्यकताओं फिट होगा)। सरल व्यवहार का समर्थन करने के लिए अतिरिक्त जेएस कोड जोड़ना एक अच्छा अभ्यास नहीं है।

:focus चयनकर्ता explained on W3C

जैसे

myelement input:focus { 
    border-style: solid; 
    border-color: green; 
    border-width: 1px; 
    border-left-width: 5px; 
} 
संबंधित मुद्दे