কৌনিক ক্ষেত্রে কীভাবে উপাদানটিকে অ্যাক্সেস করতে হবে যা ইভেন্টটিকে ট্রিগার করেছিল?


93

আমি আমার ওয়েব অ্যাপে বুটস্ট্র্যাপ এবং অ্যাঙ্গুলারজেএস উভয়ই ব্যবহার করি। দুজনকে এক সাথে কাজ করতে পেতে আমার কিছুটা সমস্যা হচ্ছে।

আমার একটি উপাদান রয়েছে, যার বৈশিষ্ট্য রয়েছে data-provide="typeahead"

<input id="searchText" ng-model="searchText" type="text"
       class="input-medium search-query" placeholder="title"
       data-provide="typeahead" ng-change="updateTypeahead()" />

এবং data-sourceব্যবহারকারী যখন ক্ষেত্রটি ইনপুট করে আমি বৈশিষ্ট্যটি আপডেট করতে চাই । ফাংশনটি updateTypeaheadসঠিকভাবে ট্রিগার করা হয়েছে, তবে ইভেন্টটি ট্রিগারকারী উপাদানগুলিতে আমার অ্যাক্সেস নেই, যতক্ষণ না আমি ব্যবহার করি না $('#searchText'), যা জিকুয়েরি উপায়, অ্যাঙ্গুলারজেএস উপায় নয়।

পুরানো স্টাইল জেএস মডিউলটির সাথে কাজ করার জন্য অ্যাংুলারজেএস পাওয়ার সর্বোত্তম উপায় কী।

উত্তর:


60
 updateTypeahead(this)

ফাংশনে DOM উপাদানটি পাস করবে না updateTypeahead(this)। এখানে thisসুযোগ উল্লেখ করা হবে। আপনি যদি DOM উপাদান ব্যবহার অ্যাক্সেস করতে চান updateTypeahead($event)। কলব্যাক ফাংশনে আপনি DOM উপাদানটি পেতে পারেন event.target

দয়া করে নোট করুন: এনজি-চেঞ্জ ফাংশনটি $ ইভেন্টটি ভেরিয়েবল হিসাবে পাস করার অনুমতি দেয় না।


65
এনজি-পরিবর্তন ইভেন্ট পঞ্জিটিকে সমর্থন করে না $ ইভেন্টটি প্যারামিটার হিসাবে পাস হচ্ছে।
মার্ক রাজকক

4
এনজি-স্টাইলটি মনে হয় সমর্থন করে না।
laggingreflex

4
ডাউনওয়েটেডও এনজি-ক্লাসের জন্য কাজ করে না। $ অনুষ্ঠানটি অপরিবর্তিত! <li ng-repeat="item in items" role="menuitem" ng-class="{\'selected\' : isSelected($event, item)}">
সাদ বেনবউজিদ

4
হ্যাঁ, সত্যিই প্রশ্নের উত্তর দেয় না, কারণ n ইভেন্টটি এনজি-চেঞ্জ নিয়ে কাজ করে না: /
অ্যাড্রিয়ান টম্বু

4
সম্ভবত সর্বাধিক ওভার রেট করা উত্তর এসও
ম্যাটটিএসপি

74

কোনও ইভেন্টকে ট্রিগার করে এমন কোনও উপাদানের অ্যাক্সেস পাওয়ার সাধারণ কৌণিক উপায় হ'ল একটি নির্দেশনা লিখুন এবং কাঙ্ক্ষিত ইভেন্টের সাথে আবদ্ধ হন:

app.directive('myChange', function() {
  return function(scope, element) {
    element.bind('change', function() {
      alert('change on ' + element);
    });
  };
});

বা ডিডিও সহ (নীচে @ টিপার্টির মন্তব্য অনুসারে):

app.directive('myChange', function() {
  return { 
    link:  function link(scope, element) {
      element.bind('change', function() {
        alert('change on ' + element);
      });
    }
  }
});

উপরোক্ত নির্দেশাবলী নীচে ব্যবহার করা যেতে পারে:

<input id="searchText" ng-model="searchText" type="text" my-change>

Plunker

পাঠ্য ক্ষেত্রে টাইপ করুন, তারপরে / অস্পষ্ট রেখে দিন। পরিবর্তন কলব্যাক ফাংশন আগুন হবে। সেই কলব্যাক ফাংশনের অভ্যন্তরে আপনার অ্যাক্সেস রয়েছে element

কিছু অন্তর্নির্মিত নির্দেশাবলী একটি ইভেন্ট ইভেন্টটি পাস করার পক্ষে সমর্থন করে। যেমন, এনজি- * ক্লিক করুন, এনজি-মাউস *। মনে রাখবেন যে এনজি-পরিবর্তন এই ইভেন্টটিকে সমর্থন করে না।

যদিও আপনি $ ইভেন্ট অবজেক্টের মাধ্যমে উপাদানটি পেতে পারেন:

<button ng-click="clickit($event)">Hello</button>

$scope.clickit = function(e) {
    var elem = angular.element(e.srcElement);
    ...

এই "গভীর কৌণিক পথ বিরুদ্ধে" যায় - Misko


আপনার সমাধানের ধরণের কাজ করার সময়, এটি ডিডিও ফর্ম্যাটটি ব্যবহার করে না, যা বাধ্যতামূলকভাবে কীভাবে স্কোপ যুক্ত / পাস করতে হবে তা নির্ধারণ করতে খুব বিভ্রান্তিকর করে তোলে। আপনার উদাহরণের থেকে সহজভাবে স্কোপিংয়ের জন্য কিছু ডিডিও চিনি যুক্ত করার সহজ উপায় নেই এবং এটি এনজি-ক্লিক থেকে ঘটনাটি পাস করার মতোই "কৌণিক পথে বিরুদ্ধে" হিসাবে গভীরভাবে মনে হয়। সত্যিকারের কৌণিক ডকুমেন্টেশন এবং কোড উদাহরণগুলিতে, আমি এমন একটি উদাহরণ খুঁজে পাইনি যা সিন্টেক্সিকভাবে আপনার অনুরূপ (যেমন কোনও নির্দেশনা কোনও ডিডিও ছাড়াই কেবল একটি বেনাম ফাংশন ফিরিয়ে দেয়))
tpartee

@ পার্ট, ভাল পয়েন্ট। ফিরে যখন আমি মূলত এই উত্তরটি লিখেছিলাম, কৌণিক ডক্সে সরল নির্দেশনার উদাহরণ রয়েছে যা কেবলমাত্র একটি বেনাম ফাংশন (যা লিঙ্ক ফাংশন) ফিরিয়ে দিয়েছে। আমি একমত যে এই দিনগুলিতে একটি ডিডিও আরও ভাল হবে। আমি উত্তর আপডেট।
মার্ক রাজকক

আমি মনে করি <বোতাম এনজি-ক্লিক = "ক্লিকিট ($ ইভেন্ট.srcElement)"> ভাল হবে
কার্লোস এবিএস

4
সময়ের সাথে সাথে আমি আরও দৃ more়ভাবে বিশ্বাস করি যে "কৌণিক উপায়" অত্যধিক সংক্ষিপ্ত এবং অত্যধিক জটিল
জ্যাকব স্ট্যাম্ম

7

আপনি উপাদানটিতে প্রথম লেখার ইভেন্টের মতো সহজেই এটি পেতে পারেন

ng-focus="myfunction(this)"

এবং আপনার জেএস ফাইলটিতে নীচের মত

$scope.myfunction= function (msg, $event) {
    var el = event.target
    console.log(el);
}

আমি এটি ব্যবহার করেছি।


8
এটি সুযোগটি ফিরিয়ে দেয়, সুতরাং এটি প্রত্যাশার মতো কাজ করবে না।
vdclouis

4
এটি কোনওভাবেই ওপির সমস্যা সমাধান করে না। নিশ্চিত যে এটি একটি ক্রিয়াকলাপটিকে কলটি কে তা জানতে দেয়, তবে এনজি-চেঞ্জ কলটিতে এর কোনও ফল নেই এবং দুজনের মধ্যে কোনও সংযোগ নেই। ওপিকে যা প্রয়োজন তা হল সেই উপাদানটির রেফারেন্স করতে সক্ষম হওয়া যা এনজি-চেঞ্জের ইভেন্টটিকে এটি করে ফাংশন কলের মধ্যে ট্রিগার করেছিল।
tpartee

এটি বৈশিষ্ট্যগুলি যোগ করে (বলুন, আইডি) কাজ করে: সতর্কতা (ইভেন্ট.আরগেট.আইডি)।
ওয়েইহুই গুও

2

আপনি যদি এই সমস্যার জন্য অন্য কোনও নির্দেশিকা তৈরি করতে না চান তবে নিয়ামকটিতে $ উপাদানটি ব্যবহার করে একটি সমাধান রয়েছে:

appControllers.controller('YourCtrl', ['$scope', '$timeout', '$element',
        function($scope, $timeout, $element) {

    $scope.updateTypeahead = function() {
       // ... some logic here
       $timeout(function() {
           $element[0].getElementsByClassName('search-query')[0].focus();
           // if you have unique id you can use $window instead of $element:
           // $window.document.getElementById('searchText').focus();
       });
    }
}]);

এবং এটি এনজি-চেঞ্জ নিয়ে কাজ করবে :

<input id="searchText" type="text" class="search-query" ng-change="updateTypeahead()" ng-model="searchText" />

0

আপনি যদি এনজি-মডেল মানটি চান, যদি আপনি ট্রিগারযুক্ত ইভেন্টে এটি লিখতে পারেন:


0

আপনার কোন সংস্করণ ছিল তা আমি নিশ্চিত নই, তবে এই প্রশ্নটি অনেক আগে থেকেই জিজ্ঞাসা করা হয়েছিল। বর্তমানে কৌনিক 1.5 এর সাথে আমি লড্যাশ থেকে ng-keypressইভেন্টটি ব্যবহার করতে পারি এবং অনুরূপ আচরণটি অনুকরণ করতে পারি, তাই আমি ইভেন্টটি ক্যাপচার করতে পারিdebounceng-change

<input type="text" ng-keypress="edit($event)" ng-model="myModel">

$ স্কোপ.এডিট = _.ডেবাউন্স (ফাংশন ($ ইভেন্ট) so কনসোল.লগ ("$ ইভেন্ট", $ ইভেন্ট) 800, 800)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.