ইনপুট ক্ষেত্রে কীভাবে ফোকাস সেট করবেন?


759

অ্যাঙ্গুলারজেএস-এ ইনপুট ক্ষেত্রে ফোকাস সেট করার 'কৌণিক উপায়' কী?

আরও নির্দিষ্ট প্রয়োজনীয়তা:

  1. যখন কোনও মডেল খোলা হয়, তখন <input>এই মডেলের অভ্যন্তরে পূর্বনির্ধারিত ফোকাস সেট করুন ।
  2. প্রতিটি সময় <input>দৃশ্যমান হয়ে যায় (উদাহরণস্বরূপ কিছু বোতাম ক্লিক করে), এতে ফোকাস সেট করুন।

আমিautofocus এটির সাথে প্রথম প্রয়োজনীয়তা অর্জনের চেষ্টা করেছি , তবে এটি কেবল তখনই কাজ করে যখন মোডাল প্রথমবারের জন্য খোলা হয়, এবং কেবলমাত্র নির্দিষ্ট ব্রাউজারগুলিতে (যেমন ফায়ারফক্সে এটি কাজ করে না)।

যে কোন ধরণের সাহায্য গ্রহন করা হবে.

উত্তর:


579
  1. যখন কোনও মডেল খোলা হয়, তখন এই মডেলের অভ্যন্তরে পূর্বনির্ধারিত <ইনপুট> এ ফোকাস সেট করুন।

একটি নির্দেশিকা সংজ্ঞায়িত করুন এবং এতে থাকুন a কোনও সম্পত্তি / ট্রিগার দেখুন যাতে উপাদানটির ফোকাস কখন করা উচিত তা তা জানে:

Name: <input type="text" focus-me="shouldBeOpen">

app.directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {
    return {
        //scope: true,   // optionally create a child scope
        link: function (scope, element, attrs) {
            var model = $parse(attrs.focusMe);
            scope.$watch(model, function (value) {
                console.log('value=', value);
                if (value === true) {
                    $timeout(function () {
                        element[0].focus();
                    });
                }
            });
            // to address @blesh's comment, set attribute value to 'false'
            // on blur event:
            element.bind('blur', function () {
                console.log('blur');
                scope.$apply(model.assign(scope, false));
            });
        }
    };
}]);

Plunker

সময়সীমাটি রেন্ডার করার জন্য মডেল সময় দেওয়ার প্রয়োজন বলে মনে হচ্ছে।

'2.' প্রতিবার <ইনপুট> দৃশ্যমান হয়ে যায় (উদাহরণস্বরূপ কিছু বোতামে ক্লিক করে), এতে ফোকাস সেট করুন।

উপরোক্তটির মতো মূলত একটি নির্দেশিকা তৈরি করুন। কিছু স্কোপ সম্পত্তি দেখুন এবং এটি সত্য হয়ে উঠলে (এটি আপনার এনজি-ক্লিক হ্যান্ডলারের মধ্যে সেট করুন) কার্যকর করুন element[0].focus()। আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনার এটির জন্য $ সময়সীমা প্রয়োজন বা নাও হতে পারে:

<button class="btn" ng-click="showForm=true; focusInput=true">show form and
 focus input</button>
<div ng-show="showForm">
  <input type="text" ng-model="myInput" focus-me="focusInput"> {{ myInput }}
  <button class="btn" ng-click="showForm=false">hide form</button>
</div>

app.directive('focusMe', function($timeout) {
  return {
    link: function(scope, element, attrs) {
      scope.$watch(attrs.focusMe, function(value) {
        if(value === true) { 
          console.log('value=',value);
          //$timeout(function() {
            element[0].focus();
            scope[attrs.focusMe] = false;
          //});
        }
      });
    }
  };
});

Plunker


আপডেট /201 / ২০১৩ : আমি দেখেছি কয়েকজন লোক আমার মূল বিচ্ছিন্ন স্কোপ নির্দেশিকা ব্যবহার করে এবং তারপরে এম্বেডড ইনপুট ক্ষেত্রগুলি (যেমন, মডেলের একটি ইনপুট ক্ষেত্র) নিয়ে সমস্যা থাকে। কোনও নতুন সুযোগ (বা সম্ভবত একটি নতুন শিশু সুযোগ) নেই এমন একটি নির্দেশের ব্যথা কিছুটা উপশম করা উচিত। সুতরাং উপরে আমি পৃথক স্কোপগুলি ব্যবহার না করার উত্তরটি আপডেট করেছি। নীচে মূল উত্তরটি দেওয়া হল:

1 এর মূল উত্তর, বিচ্ছিন্ন সুযোগ ব্যবহার করে:

Name: <input type="text" focus-me="{{shouldBeOpen}}">

app.directive('focusMe', function($timeout) {
  return {
    scope: { trigger: '@focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === "true") { 
          $timeout(function() {
            element[0].focus(); 
          });
        }
      });
    }
  };
});

Plunker

2 এর মূল উত্তর, বিচ্ছিন্ন সুযোগ ব্যবহার করে:

<button class="btn" ng-click="showForm=true; focusInput=true">show form and
 focus input</button>
<div ng-show="showForm">
  <input type="text" focus-me="focusInput">
  <button class="btn" ng-click="showForm=false">hide form</button>
</div>

app.directive('focusMe', function($timeout) {
  return {
    scope: { trigger: '=focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === true) { 
          //console.log('trigger',value);
          //$timeout(function() {
            element[0].focus();
            scope.trigger = false;
          //});
        }
      });
    }
  };
});

Plunker

যেহেতু আমাদের নির্দেশে ট্রিগার / ফোকাসইপুট সম্পত্তিটিকে পুনরায় সেট করতে হবে, তাই দ্বি-মুখী ডেটাবেন্ডিংয়ের জন্য '=' ব্যবহৃত হয়। প্রথম নির্দেশনায় '@' যথেষ্ট ছিল। এছাড়াও মনে রাখবেন যে '@' ব্যবহার করার সময় আমরা ট্রিগার মানটিকে "সত্য" সাথে তুলনা করি যেহেতু @ সর্বদা একটি স্ট্রিংয়ের ফলস্বরূপ।


1
@ জোশের "ফোকাস" নির্দেশিকাটিও দেখুন: stackoverflow.com/a/14859639/215945 তিনি তার বাস্তবায়নে কোনও বিচ্ছিন্ন সুযোগ ব্যবহার করেন নি।
মার্ক রাজকক

2
@ মারকরাজাকক এই সম্পর্কে শুধু কৌতূহলযুক্ত: এই সংস্করণটি কাজ করে তবে আমি যদি ng-modelইনপুট ক্ষেত্রে একটি সেট করি তবে আমি যখন এই নির্দেশিকা ডাব্লু / বিচ্ছিন্ন সুযোগ ব্যবহার করি তখন মডেল মানটি নষ্ট হয়ে যায়। যদি আমি জোশের সংস্করণটি বিচ্ছিন্নতার সুযোগ থেকে ডেকে আনি তবে সমস্যা হয় না। এখনও একটি নবাগত, এবং আমি পার্থক্য বুঝতে চাই। এখানে একটি প্লাঙ্কার এটি দেখায়।
সুনীল ডি

1
আমি খুঁজে পেয়েছি যে # 1 অ্যাঙ্গুলারজেএস 1.0.6 এর সাথে খুব ভাল কাজ করে। তবে, কোনও ডিবাগারের অধীনে চলার সময় আমি লক্ষ্য করেছি যে প্রতিবার যখন আমি আমার মডেলকে বরখাস্ত করে এবং পুনরায় খুলি তখন আমি ফাংশনে আরও একটি অতিরিক্ত কল দেখছিলাম যা আগের সময়ের চেয়ে ফোকাস সেট করে। আমি কখন এই ঘড়ির কাজটি বন্ধ করার জন্য সেই ফাংশনটি কিছুটা সংশোধন করেছি value != "true"এবং এটি আমার সমস্যার সমাধান করার জন্য উপস্থিত হয়েছিল।
অ্যান্ড্রু ব্রাউন

1
সুতরাং ... একটি রাষ্ট্রীয় পৃষ্ঠায় আমার একই জিনিস চলছিল কারণ $ ওয়াচ $ ওয়াচ এবং কৌণিক বিকাশকারীরা ভালোবাসে love ঘড়ি ... ভালভাবেই আমি একটি সমস্যার মুখোমুখি হলাম মিঃ @ মারকরাজাকক, আমি (বেসিক) সমাধানটি দিয়ে সমাধান করেছি এমন একটি সমস্যা I নীচে প্রস্তাবিত।
বেন লেশ

3
আমার জন্য এইচএমএম কোড কাজ করে, যেমন আমি এটি সঠিকভাবে চালিত করতে দেখতে পারি এবং উপাদান [0] সঠিক নিয়ন্ত্রণ। তবে .ফোকাস () কোনও ফোকাস ট্রিগার করে না। সম্ভবত বুটস্ট্র্যাপ বা অন্য কিছু হস্তক্ষেপ করছে?
সোনিক সোল

264

(সম্পাদনা: আমি এই ব্যাখ্যার নীচে একটি আপডেট সমাধান যুক্ত করেছি)

মার্ক Rajcok মানুষ ... এবং তার উত্তর একটি বৈধ উত্তর, কিন্তু এটা হয়েছে একটি ত্রুটি (দুঃখিত মার্ক) ছিল ...

... ইনপুটটিতে ফোকাস করার জন্য বুলিয়ান ব্যবহার করার চেষ্টা করুন, তারপরে ইনপুটটি ঝাপসা করুন, তারপরে আবার ইনপুটটিকে ফোকাস করতে এটি ব্যবহার করার চেষ্টা করুন। আপনি বুলিয়ানটিকে মিথ্যাতে পুনরায় সেট না করা ছাড়া এটি কাজ করবে না, তারপরে $ ডাইজেস্ট করুন, আবার এটিকে সত্যটিতে পুনরায় সেট করুন। এমনকি আপনি যদি আপনার অভিব্যক্তিতে একটি স্ট্রিং তুলনা ব্যবহার করেন, আপনি স্ট্রিংটিকে অন্য কোনও কিছুতে, ডাইজেস্ট, এবং তারপরে পরিবর্তন করতে বাধ্য হবেন। (এটি অস্পষ্ট ইভেন্ট হ্যান্ডলারের সাথে সম্বোধন করা হয়েছে))

সুতরাং আমি এই বিকল্প সমাধানটি প্রস্তাব করছি:

একটি ইভেন্ট ব্যবহার করুন, কৌণিকের ভুলে যাওয়া বৈশিষ্ট্য।

জাভাস্ক্রিপ্ট সব পরে ঘটনা পছন্দ করে। ইভেন্টগুলি সহজাতভাবে আলগাভাবে মিলিত হয় এবং আরও ভাল, আপনি অন্য হজম করতে অন্য $ ঘড়ি যুক্ত এড়ান।

app.directive('focusOn', function() {
   return function(scope, elem, attr) {
      scope.$on(attr.focusOn, function(e) {
          elem[0].focus();
      });
   };
});

সুতরাং এখন আপনি এটি এর মতো ব্যবহার করতে পারেন:

<input type="text" focus-on="newItemAdded" />

এবং তারপরে আপনার অ্যাপের যে কোনও জায়গায় ...

$scope.addNewItem = function () {
    /* stuff here to add a new item... */

    $scope.$broadcast('newItemAdded');
};

এটি দুর্দান্ত কারণ আপনি এরকম কিছু দিয়ে সমস্ত ধরণের কাজ করতে পারেন। একটির জন্য, আপনি ইতিমধ্যে বিদ্যমান ইভেন্টগুলিতে টাই করতে পারেন। অন্য একটি জিনিসের জন্য আপনি আপনার অ্যাপ্লিকেশনটির বিভিন্ন অংশের ইভেন্টগুলি প্রকাশের মাধ্যমে স্মার্ট কিছু করা শুরু করেন যা আপনার অ্যাপ্লিকেশনটির অন্যান্য অংশ সাবস্ক্রাইব করতে পারে।

যাইহোক, এই ধরণের জিনিস আমাকে "ইভেন্ট চালিত" বলে চিৎকার করে। আমি মনে করি কৌণিক বিকাশকারী হিসাবে আমরা হাতুড়ি $ স্কোপ আকৃতির খাঁজগুলিকে ইভেন্টের আকারের ছিদ্রগুলিতে শক্ত করার চেষ্টা করি।

এটি কি সেরা সমাধান? আমি জানিনা. এটি একটি সমাধান।


আপডেট সমাধান

নীচে @ শিমোনআরচেলেঙ্কোর মন্তব্যের পরে, আমি আমার এই পদ্ধতিটি কিছুটা পরিবর্তন করেছি। এখন আমি একটি পরিষেবা এবং একটি নির্দেশকের সংমিশ্রণ ব্যবহার করি যা একটি ইভেন্ট "পর্দার আড়ালে" পরিচালনা করে:

তা বাদে এটি উপরে বর্ণিত একই অধ্যক্ষ।

এখানে একটি দ্রুত ডেমো প্লঙ্ক রয়েছে

ব্যবহার

<input type="text" focus-on="focusMe"/>
app.controller('MyCtrl', function($scope, focus) {
    focus('focusMe');
});

সূত্র

app.directive('focusOn', function() {
   return function(scope, elem, attr) {
      scope.$on('focusOn', function(e, name) {
        if(name === attr.focusOn) {
          elem[0].focus();
        }
      });
   };
});

app.factory('focus', function ($rootScope, $timeout) {
  return function(name) {
    $timeout(function (){
      $rootScope.$broadcast('focusOn', name);
    });
  }
});

3
আপনি যদি কন্ট্রোলারে প্রবেশের কাজ করতে চান তবে আপনার $broadcastসাথে কলটি মোড়ানো দরকার $timeout। অন্যথায় চমৎকার সমাধান।
শিমন রাচলেঙ্কো

@ শিমন রাচলেনকো - ধন্যবাদ Sure সময়সীমা দ্বারা আপনি কী বোঝাতে চাইছেন তা আমি নিশ্চিত নই। কন্ট্রোলার কনস্ট্রাক্টর প্রক্রিয়া চলাকালীন আমি যদি সম্প্রচার করতে চাইতাম, আমি ঠিক তখনই সম্প্রচার করব। একটি সময়সীমা কিছু না করে কেবল ইভেন্ট লুপের পরে সম্পাদনের জন্য সম্প্রচারকে পিছিয়ে দেয়।
বেন লেশ

1
হ্যাঁ, এবং নির্দেশটি আরম্ভ করার পক্ষে এটি যথেষ্ট। দিকনির্দেশনাটি শুনতে শুরুর আগেই ওভারওয়্যার ইভেন্টটি সম্প্রচারিত করা হয় .. আবার, আপনি যখন পৃষ্ঠায় প্রবেশ করবেন তখন আপনার নির্দেশকে ট্রিগার করতে চাইলে এটি কেবল তখনই প্রয়োজন।
শিমন রাচলেঙ্কো

2
আপনি ঠিক বলেছেন। আমার ধারণা আমি লোডের উপর ফোকাস করার জন্য এটি ব্যবহার করিনি। উত্তরটি আরও শক্তিশালী কিছু দিয়ে আপডেট করব।
বেন লেশ

1
এটি এখন পর্যন্ত, সবচেয়ে মার্জিত, "কৌণিক উপায়" সমাধান। যদিও আমি প্রথমে কোডটি অনুলিপি করেছিলাম যখন আমি প্রথম এই সমস্যার মুখোমুখি হয়েছিলাম তবে আমি খুশি যে আপনি এটির জন্য একটি মডিউল তৈরি করেছেন! আমি সত্যই মনে করি এটি মূল কৌণিকের মধ্যে getোকার চেষ্টা করা উপযুক্ত।
র্যান্ডলফো

241

আপনার যখন সত্যিই প্রয়োজন এমন কিছু হয় তখন আমি অতিরিক্ত উত্তরগুলির মধ্যে কয়েকটি অতি মাত্রায় জটিল হতে দেখেছি

app.directive('autoFocus', function($timeout) {
    return {
        restrict: 'AC',
        link: function(_scope, _element) {
            $timeout(function(){
                _element[0].focus();
            }, 0);
        }
    };
});

ব্যবহার হয়

<input name="theInput" auto-focus>

আমরা ডমের জিনিসগুলি রেন্ডার করতে সময়সীমা ব্যবহার করি, যদিও এটি শূন্য হলেও কমপক্ষে এটির জন্য অপেক্ষা করে - এই পদ্ধতিটি মডেলগুলিতে কাজ করে এবং কী ঘটে না


1
এটি করার বিভিন্ন উপায় থাকবে, একটি সম্ভাব্য উপায় যা সত্যই সোজা এগিয়ে এবং সহজ উপায়টি স্কোপের (এখানে নিয়ন্ত্রক) আইটেমটির আইডি সেট করতে হবে যা আপনি বোতামটি ক্লিক করার সময় ফোকাস করতে চান, তারপরে নির্দেশিকা কেবল এই শুনতে। এক্ষেত্রে আপনাকে নির্দেশিকা নির্দিষ্টভাবে কোথাও রাখার দরকার নেই, কেবলমাত্র সেই পৃষ্ঠার মধ্যেই কোথাও (আমি অতীতে সাফল্যের সাথে এই ধরণের প্রহরী নির্দেশিকা ব্যবহার করেছি, বিশেষত বিষয়গুলিকে ফোকাস করা এবং জিনিসগুলি স্ক্রোলিং সহ) - তবে আপনি যদি ' পুনরায় jquery ব্যবহার করে (এটি আরও সহজ করে তুলবে) কেবল সেই উপাদানটির আইডি খুঁজে নিন এবং এটি ফোকাস করুন
ecancil

14
ইনপুট পপআপ মডেলে অবস্থিত থাকলে শূন্য সময়সীমা সহ সমাধান আমার পক্ষে কাজ করে না। এমনকি 10 এমএস সমস্যার সমাধান করে
ইউজিন ফিদেলিন

@ কনসিল: আমি আপনার পদ্ধতির পছন্দ করি কারণ এটি সহজতম, তবে আপনাকে IE এ টাইমআউট ~ 500ms নির্ধারণ করতে হবে কারণ মডেলের উপস্থিতির অ্যানিমেশনটি ইনপুটটির বাইরে একটি ঝলকানো কার্সারের ফলস্বরূপ। অ্যানিমেশনটি শেষ হওয়ার পরে এটি হওয়ার একটি দুর্দান্ত উপায় আমি জানি না, তাই আমি 500 মিমি দিয়ে জোর করে এনেছি।
Dev93

কাজ করবে না, যদি আপনাকে ডাটাবেস থেকে আরও ডেটা টানতে হয়, এটি নিয়ন্ত্রণকারীটি টানা তথ্য সমাপ্ত করার জন্য অপেক্ষা করতে হবে, সুতরাং 0 এর জায়গায় পর্যাপ্ত সময় যোগ করুন
আলী আদ্রবী

1
@ অ্যাডের মতো যারা এইটিকে একটি সাধারণ দিয়ে ব্যবহার করতে চান তাদের জন্য ng-click: আসুন বলি যে আপনার ইনপুটটিতে একটি বোতাম ক্লিক করা আছে ng-click="showInput = !showInput। তারপরে, আপনার আসল ইনপুটটিতে যোগ করুন ng-if="showInput"। বোতামটি টগল করা প্রতিটি সময় নির্দেশকে পুনরায় চালিত করবে। আমি এটি ব্যবহার করার সময় এটির সাথে একটি সমস্যা ছিল ng-showযা ভুল পদ্ধতির।
জেভিজি

90

এইচটিএমএলের একটি বৈশিষ্ট্য রয়েছে autofocus

<input type="text" name="fname" autofocus>

http://www.w3schools.com/tags/att_input_autofocus.asp


29
দুর্ভাগ্যক্রমে, এটি যদি কেবলমাত্র একবারে কাজ করে। আমি এটি স্থানের পরিস্থিতিতে একটি কৌণিক সম্পাদনায় ব্যবহার করেছি এবং এটি প্রথমবার ফায়ারফক্সে নয়, ক্রোমে দুর্দান্ত কাজ করেছে। ক্রোমে যখন আমি অন্য কোনও আইটেমটি জায়গায় সম্পাদনা করতে ক্লিক করি বা আবার একই আইটেমটিতে আবারও ফোকাস হয় না। দস্তাবেজগুলি জানিয়েছে যে এটি পৃষ্ঠা লোডে কাজ করে, যা কেবলমাত্র একবার কৌণিক অ্যাপে ঘটে। যদি কেবল এটি সাধারণ ছিল, তবে আমরা সবাই 20% উপার্জনের সৈকতে বসে থাকতাম!
নোকটারনো

62

আপনি কৌণিক মধ্যে নির্মিত jqlite কার্যকারিতা ব্যবহার করতে পারেন।

angular.element('.selector').trigger('focus');


2
জ্যাকোরি লোড ছাড়াই: কৌণিক.ফরএচ (ডকুমেন্ট.কোয়ারিসিলিটরআল ('। নির্বাচক'), ফাংশন (এলেম) {ইলেম.ফোকাস ();});
ড্যান বেনামি

29
এটি একটি নিয়ামক মধ্যে রাখা খারাপ অভ্যাস না?
ভাইটালিবি

2
যদি এই জ্যাকলাইট লাইনটি একটি নিয়ামকের ভিতরে রাখা খারাপ অভ্যাস হয়, তবে এই জিক্লাইট লাইনটি কোনও নির্দেশকের ভিতরে রাখাই ভাল নয়?
স্পোর্টস

3
আমি এটি পেয়েছি:Looking up elements via selectors is not supported by jqLite!
মারিয়া ইনেস পার্নিসারি

1
@ ভাইটালিবি আমার একটি মামলা হয়েছে যেখানে এজ্যাক্স কল করার পরে আমার একটি উপাদান ঝাপসা করার দরকার হয়েছিল। আমি নিয়ামকের অভ্যন্তরে কলব্যাকে খাঁটি জেএসের কেবল একটি লাইন যুক্ত করতে পারি বা input ইনপুটটির অস্পষ্টতার জন্য একচেটিয়াভাবে একটি সম্পূর্ণ নির্দেশিকা তৈরি করতে পারি। আমি কেবল অনুভব করেছি যে এটি কোনও ঝামেলা খুব বেশি, তাই আমি প্রথম বিকল্পের জন্য গিয়েছিলাম।
সেবাস্তিয়ানব

55

এটি ভাল কাজ করে এবং ইনপুট নিয়ন্ত্রণকে ফোকাস করার জন্য একটি কৌনিক উপায় way

angular.element('#elementId').focus()

এটি যদিও টাস্কটি করার খাঁটি কৌণিক পদ্ধতি নয় তবুও সিনট্যাক্সটি কৌনিক শৈলীর অনুসরণ করে। জিকিউরি পরোক্ষভাবে ভূমিকা পালন করে এবং অ্যাংুলার (jQLite => JQuery আলো) ব্যবহার করে সরাসরি DOM অ্যাক্সেস করে।

প্রয়োজনে এই কোডটি সহজেই একটি সাধারণ কৌণিক নির্দেশের ভিতরে রাখা যেতে পারে যেখানে উপাদানটি সরাসরি অ্যাক্সেসযোগ্য।


আমি নিশ্চিত নই যে ভিউমোডেল-অ্যাপসের জন্য এটি দুর্দান্ত উপায় approach কৌণিক ক্ষেত্রে এটি অবশ্যই নির্দেশের মাধ্যমে করা উচিত।
আগত

উদাহরণস্বরূপ, যদি কেউ একটি টেক্সবক্স এ পরিবর্তন করে এবং আপনাকে পপ আপ দেখাতে হবে এবং অন্য পাঠ্যবক্স বিতে ফোকাস সেট করতে হবে
সঞ্জিব সিং

1
এটি ব্যবহার করার সময় আমি এই ত্রুটিটি পাচ্ছি:Looking up elements via selectors is not supported by jqLite!
JVG

6
যতদূর আমি বলতে পারি আপনাকে প্রথমে নির্ভরতা হিসাবে jQuery লোড করতে হবে, এক্ষেত্রে angular.elementএকটি মোড়ক হয়ে যায় $() / jQuery()। সুতরাং এটি ছাড়া এটি কাজ করবে না, এবং আপনি মূলত যেভাবেই হোক jQuery ব্যবহার করছেন (তবে আমি ভুল হলে আমাকে সংশোধন করুন)
JVG

@ জ্যাসिकेशन: jqLite অপসারণ jQuery নির্ভরতা উন্নত হয়। ডোমে কোনও উপাদান অ্যাক্সেস করার জন্য আপনার পুরো jQuery দরকার নেই। তবে আপনার যদি jQuery ইনস্টল করা থাকে তবে অ্যাংুলার jQuery উল্লেখ করবে। এটি দেখুন: docs.angularjs.org/api/angular.element
সঞ্জীব সিং

31

আমি মনে করি না $ টাইমআউটটি সৃষ্টির উপাদানটিকে ফোকাস করার একটি ভাল উপায়। কৌণিক ডক্সের নিস্তরঙ্গ গভীরতা থেকে খননকৃত কৌণিক কার্যকারিতা ব্যবহার করে এখানে একটি পদ্ধতি is প্রি-লিঙ্ক এবং পোস্ট-লিংক ফাংশনের জন্য কীভাবে "লিঙ্ক" বৈশিষ্ট্যটিকে "প্রাক" এবং "পোস্ট" এ বিভক্ত করা যেতে পারে তা লক্ষ্য করুন।

কাজের উদাহরণ: http://plnkr.co/edit/Fj59GB

// this is the directive you add to any element you want to highlight after creation
Guest.directive('autoFocus', function() {
    return {
        link: {
            pre: function preLink(scope, element, attr) {
                console.debug('prelink called');
                // this fails since the element hasn't rendered
                //element[0].focus();
            },
            post: function postLink(scope, element, attr) {
                console.debug('postlink called');
                // this succeeds since the element has been rendered
                element[0].focus();
            }
        }
    }
});
<input value="hello" />
<!-- this input automatically gets focus on creation -->
<input value="world" auto-focus />

সম্পূর্ণ AngularJS নির্দেশিকা ডক্স: https://docs.angularjs.org/api/ng/service/$compile


2
এটি আমার জন্য কাজ করার জন্য [0] .ফোকাস () উপাদানটি একটি সময়সীমার মধ্যে আবদ্ধ করতে হয়েছিল।
কোডিন

@ বিবোডেনমিলার আমার মডেলের একটি বিবর্ণ-আউট জিনিস প্রয়োগ করা হয়েছে, যখন উপাদান তৈরি হয়ে যায় এটি অদৃশ্য (100% স্বচ্ছ), তাই ব্রাউজারগুলি নিঃশব্দে অনুরোধকে ফোকাস করে। স্পষ্টতই কিছু মিলিসেকেন্ড পাস করা প্রায় স্বচ্ছ কিন্তু দৃশ্যমান ইনপুট / বোতামটিতে ফোকাস করার অনুমতি দেয়।
তুষারপাত

1
ডক্স অনুসারে, "লিঙ্ক" ফাংশনগুলি ডিফল্টরূপে "পোস্টলিঙ্ক" হয়। এছাড়াও দেখুন: bennadel.com/blog/…
টেট

17

আমার মূল সমাধানটি এখানে:

plunker

var app = angular.module('plunker', []);
app.directive('autoFocus', function($timeout) {
    return {
        link: function (scope, element, attrs) {
            attrs.$observe("autoFocus", function(newValue){
                if (newValue === "true")
                    $timeout(function(){element[0].focus()});
            });
        }
    };
});

এবং এইচটিএমএল:

<button ng-click="isVisible = !isVisible">Toggle input</button>
<input ng-show="isVisible" auto-focus="{{ isVisible }}" value="auto-focus on" />

এর মানে কি:

এটি এনজি-শোয়ের সাথে দৃশ্যমান হওয়ার সাথে সাথে ইনপুটটিকে কেন্দ্র করে। এখানে $ ঘড়ি বা of এর কোনও ব্যবহার নেই।


আসলে আমি বিশ্বাস করি যে {{isvisible} any যাইহোক একটি ঘড়ি তৈরি করছে, সুতরাং "$ ঘড়ির কোনও ব্যবহার" বিবৃতি ভুল নয় is
মাসিম্প্লো

হ্যাঁ, আমি মনে করি আপনি ঠিক বলেছেন। তবে এটি এটি করার সহজ উপায় হিসাবে কাজ করে।
এডহোলার

17

আমি সম্প্রতি মডেলের মতো দ্বি-মুখী বাইন্ডিং ফোকাস নির্দেশিকা লিখেছি।

আপনি ফোকাস নির্দেশিকাটি এর মতো ব্যবহার করতে পারেন:

<input focus="someFocusVariable">

আপনি যদি আপনার নিয়ামকের trueযে কোনও জায়গায় কিছু ফোকাস পরিবর্তনযোগ্য স্কোপ পরিবর্তনশীল করেন তবে ইনপুটটি কেন্দ্রীভূত হয়। এবং আপনি যদি নিজের ইনপুটটিকে "ঝাপসা" করতে চান তবে কিছু ফোকাসে পরিবর্তনশীলকে মিথ্যাতে সেট করা যেতে পারে। এটি মার্ক রাজককের প্রথম উত্তরের মতো তবে দ্বিমুখী বাঁধাইয়ের সাথে।

নির্দেশটি এখানে:

function Ctrl($scope) {
  $scope.model = "ahaha"
  $scope.someFocusVariable = true; // If you want to focus initially, set this to true. Else you don't need to define this at all.
}

angular.module('experiement', [])
  .directive('focus', function($timeout, $parse) {
    return {
      restrict: 'A',
      link: function(scope, element, attrs) {
          scope.$watch(attrs.focus, function(newValue, oldValue) {
              if (newValue) { element[0].focus(); }
          });
          element.bind("blur", function(e) {
              $timeout(function() {
                  scope.$apply(attrs.focus + "=false"); 
              }, 0);
          });
          element.bind("focus", function(e) {
              $timeout(function() {
                  scope.$apply(attrs.focus + "=true");
              }, 0);
          })
      }
    }
  });

ব্যবহার:

<div ng-app="experiement">
  <div ng-controller="Ctrl">
    An Input: <input ng-model="model" focus="someFocusVariable">
    <hr>
        <div ng-click="someFocusVariable=true">Focus!</div>  
        <pre>someFocusVariable: {{ someFocusVariable }}</pre>
        <pre>content: {{ model }}</pre>
  </div>
</div>

এই হৈচৈ

http://fiddle.jshell.net/ubenzer/9FSL4/8/


এটি সঠিক উত্তর হওয়া উচিত। এটি সমস্ত ব্যবহারের কেসগুলি কভার করে।
কুণাল

11

যারা বুটস্ট্র্যাপ প্লাগইন সহ কৌণিক ব্যবহার করেন তাদের জন্য:

http://angular-ui.github.io/bootstrap/#/modal

আপনি openedমডেল উদাহরণের প্রতিশ্রুতি দিতে পারেন :

modalInstance.opened.then(function() {
        $timeout(function() {
            angular.element('#title_input').trigger('focus');
        });
    });

modalInstance.result.then(function ( etc...

ভাল! তবে আমার ক্ষেত্রে, $timeoutসঙ্গে 50msপরিবর্তে প্রয়োজন হয় 0
lk_vc

8

আমি একটি সাধারণ অভিব্যক্তি ব্যবহার করা দরকারী বলে মনে করি। ইনপুট পাঠ্যটি বৈধ হয়ে গেলে আপনি স্বয়ংক্রিয়ভাবে ফোকাস সরিয়ে ফেলার মতো স্টাফ করতে পারেন

<button type="button" moo-focus-expression="form.phone.$valid">

অথবা ব্যবহারকারী যখন একটি নির্দিষ্ট দৈর্ঘ্যের ক্ষেত্রটি সমাপ্ত করে তখন স্বয়ংক্রিয়ভাবে ফোকাস করুন

<button type="submit" moo-focus-expression="smsconfirm.length == 6">

এবং অবশ্যই লোড পরে ফোকাস

<input type="text" moo-focus-expression="true">

নির্দেশের জন্য কোড:

.directive('mooFocusExpression', function ($timeout) {
    return {
        restrict: 'A',
        link: {
            post: function postLink(scope, element, attrs) {
                scope.$watch(attrs.mooFocusExpression, function (value) {

                    if (attrs.mooFocusExpression) {
                        if (scope.$eval(attrs.mooFocusExpression)) {
                            $timeout(function () {
                                element[0].focus();
                            }, 100); //need some delay to work with ng-disabled
                        }
                    }
                });
            }
        }
    };
});

7

কোনও জম্বিটিকে পুনরুত্থিত করতে বা নিজের নির্দেশকে প্লাগ করতে নয় (ঠিক আমি যা করছি তা ঠিক আছে):

https://github.com/hiebj/ng-focus-if

http://plnkr.co/edit/MJS3zRk079Mu72o5A9l6?p=preview

<input focus-if />

(function() {
    'use strict';
    angular
        .module('focus-if', [])
        .directive('focusIf', focusIf);

    function focusIf($timeout) {
        function link($scope, $element, $attrs) {
            var dom = $element[0];
            if ($attrs.focusIf) {
                $scope.$watch($attrs.focusIf, focus);
            } else {
                focus(true);
            }
            function focus(condition) {
                if (condition) {
                    $timeout(function() {
                        dom.focus();
                    }, $scope.$eval($attrs.focusDelay) || 0);
                }
            }
        }
        return {
            restrict: 'A',
            link: link
        };
    }
})();

আমি এখন এই নির্দেশনাটি ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে, সাধারণ সমস্যা সমাধান করে এবং অতিরিক্ত জটিল নয় isn't একটি $ সময়সীমা মুক্ত সমাধানের সন্ধানে ছেড়ে দেওয়া কৌণিক 1.1 এবং 1.2 এর জন্য ফোকাসটি "রোডম্যাপে" রয়েছে বলে মন্তব্য সন্ধান করতে থাকুন তবে আমি 2.x ব্যবহার করছি এবং এখনও কোনও ফোকাস পরিচালনা নেই। হেহ।
টেকহেইড

6

প্রথমত, ফোকাস করার একটি সরকারী উপায় হ'ল 1.1 এর রোডম্যাপে । এদিকে, আপনি সেটিং ফোকাস বাস্তবায়নের জন্য একটি নির্দেশিকা লিখতে পারেন।

দ্বিতীয়ত, কোনও আইটেমটি দৃশ্যমান হওয়ার পরে তার উপর ফোকাস সেট করার জন্য বর্তমানে একটি কর্মসংস্থান প্রয়োজন। শুধুমাত্র আপনার কলটিকে এলিমেন্ট ফোকাসে () দিয়ে বিলম্ব করুন $timeout

ফোকাস, অস্পষ্ট ও নির্বাচন করার জন্য একই নিয়ামক-সংশোধন-ডম সমস্যাটি উপস্থিত থাকার কারণে, আমি একটি ng-targetনির্দেশ থাকার প্রস্তাব দিচ্ছি :

<input type="text" x-ng-model="form.color" x-ng-target="form.colorTarget">
<button class="btn" x-ng-click="form.colorTarget.focus()">do focus</button>

কৌণিক থ্রেড এখানে: http://goo.gl/ipsx4 , এবং আরও বিশদ এখানে ব্লগ করা হয়েছে: http://goo.gl/4rdZa

নিম্নলিখিত নির্দেশাবলী .focus()আপনার ng-targetঅ্যাট্রিবিউট দ্বারা নির্দিষ্ট হিসাবে আপনার নিয়ামকের ভিতরে একটি ফাংশন তৈরি করবে । (এটি একটি .blur()এবং একটিও তৈরি করে .select())) ডেমো: http://jsfiddle.net/bseib/WUcQX/


রোডম্যাপ রেফারেন্সের জন্য +1। বাস্তবে আমি এটি কেবল অস্থির হিসাবে বিবেচিত 1.2 এর ডকুমেন্টেশনে দেখেছি ( ডকস.আঙ্গুলারজেএস.আর.পি.আই / ডায়ারেক্টিভ: এফফোকাস )
এডউইন ডালোরজো

27
@ এডউইন ডালোরজো ঘটনাগুলি ngFocusহ্যান্ডেল focusকরার উপায় হিসাবে দেখা যাচ্ছে, কোনও উপাদানের উপর ফোকাস সেট করার উপায় নয় ।
টেলিক্লিমবার

6

আপনার নিজস্ব নির্দেশ তৈরি করার পরিবর্তে, কোনও ফোকাস অর্জনের জন্য জাভাস্ক্রিপ্ট ফাংশনগুলি সহজেই ব্যবহার করা সম্ভব।

এখানে একটি উদাহরণ।

এইচটিএমএল ফাইলটিতে:

<input type="text" id="myInputId" />

একটি ফাইল জাভাস্ক্রিপ্টে, উদাহরণস্বরূপ একটি নিয়ামক হিসাবে, যেখানে আপনি ফোকাসটি সক্রিয় করতে চান:

document.getElementById("myInputId").focus();

9
এটি কোনও 'কৌণিক উপায়' নয় এবং লোকেদের তাদের নিয়ামকদের DOM স্পর্শ করার পরামর্শ দিবেন না।
smajl

কৌণিক মধ্যে ভ্যানিলা ব্যবহার না করাই সেরা, কারণ কৌণিক এটি ট্র্যাক করতে পারে না বা এটিকে অন্য কোনও কিছুতে সিঙ্কে রাখতে পারে না।
এডগার কুইন্টারো

4

আপনি যদি কেবল একটি সাধারণ ফোকাস চেয়েছিলেন যা কোনও এনজি-ক্লিক দ্বারা নিয়ন্ত্রিত হয়।

এইচটিএমএল:

<input ut-focus="focusTigger">

<button ng-click="focusTrigger=!focusTrigger" ng-init="focusTrigger=false"></button>

নির্দেশিকা:

'use strict'

angular.module('focus',['ng'])
.directive('utFocus',function($timeout){
    return {
        link:function(scope,elem,attr){
            var focusTarget = attr['utFocus'];
            scope.$watch(focusTarget,function(value){
                $timeout(function(){
                    elem[0].focus();
                });
            });
        }
    }
});

4

একটি সাধারণ যা মডেলগুলির সাথে ভালভাবে কাজ করে:

.directive('focusMeNow', ['$timeout', function ($timeout)
{
    return {
        restrict: 'A',

        link: function (scope, element, attrs)
        {


            $timeout(function ()
            {
                element[0].focus();
            });



        }
    };
}])

উদাহরণ

<input ng-model="your.value" focus-me-now />

আমার জন্য একদম সঠিক. আপনাকে ধন্যবাদ
আলেকজান্ডার

3

আপনি কেবল একটি নির্দেশিকা তৈরি করতে পারেন যা পোস্ট লিঙ্কিংয়ে সজ্জিত উপাদানগুলিতে মনোনিবেশ করে:

angular.module('directives')
.directive('autoFocus', function() {
    return {
        restrict: 'AC',
        link: function(_scope, _element) {
            _element[0].focus();
        }
    };
});

তারপরে আপনার এইচটিএমএলে:

<input type="text" name="first" auto-focus/> <!-- this will get the focus -->
<input type="text" name="second"/>

এটি মডেলগুলি এবং এনজি-ইফ টগলড উপাদানগুলির জন্য কাজ করবে, এনজি-শোয়ের জন্য নয়, যেহেতু পোস্টলিঙ্কিং কেবল এইচটিএমএল প্রসেসিংয়ে ঘটে।


3

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

সুতরাং আমি এখানে এটিই শেষ করেছি যা ব্লেশের উত্তর থেকে অনেকগুলি চুরি করে তবে নিয়ামক ইভেন্টের শব্দার্থক এবং "লোডের পরে" পরিষেবাটি আলাদা রাখে।

এটি নিয়ামক ইভেন্টটিকে কেবলমাত্র একটি নির্দিষ্ট উপাদানকে ফোকাস করা ছাড়া অন্য জিনিসগুলির জন্য খুব সহজেই ঝুঁকতে দেয় এবং "লোডের পরে" কার্যকারিতা কেবলমাত্র প্রয়োজন হলে ওভারহেডকে সজ্জিত করতে দেয় যা এটি অনেক ক্ষেত্রে নাও হতে পারে।

ব্যবহার

<input type="text" focus-on="controllerEvent"/>
app.controller('MyCtrl', function($scope, afterLoad) {
  function notifyControllerEvent() {
      $scope.$broadcast('controllerEvent');
  }

  afterLoad(notifyControllerEvent);
});

সূত্র

app.directive('focusOn', function() {
   return function(scope, elem, attr) {
      scope.$on(attr.focusOn, function(e, name) {
        elem[0].focus();
      });
   };
});

app.factory('afterLoad', function ($rootScope, $timeout) {
  return function(func) {
    $timeout(func);
  }
});

একটি এবং একমাত্র উত্তর, যা আমি (সম্পূর্ণ শিক্ষানবিশ) বুঝতে পারি। "AfterLoad (notifyControllerEvent);" এর পরিবর্তে, আমি "notifyControllerEvent ()" ব্যবহার করতাম। অন্যথায়, এটি কিছু ত্রুটি দিয়ে শেষ হয়েছিল।
ভেল মুরুগান এস

3

এটি ব্যবহার করাও সম্ভব ngModelController। 1.6+ নিয়ে কাজ করা (পুরানো সংস্করণগুলির সাথে জানেন না)।

এইচটিএমএল

<form name="myForm">
    <input type="text" name="myText" ng-model="myText">
</form>

জাতীয়

$scope.myForm.myText.$$element.focus();

-

এনবি: প্রসঙ্গের উপর নির্ভর করে আপনাকে একটি টাইমআউট ফাংশনে আবদ্ধ করতে হতে পারে।

এনবি²: ব্যবহার করার সময় controllerAs, এটি প্রায় একই রকম। জেএস এর name="myForm"সাথে name="vm.myForm"এবং কেবল প্রতিস্থাপন করুন vm.myForm.myText.$$element.focus();


3

সম্ভবত, ES6 বয়সের সবচেয়ে সহজ সমাধান।

নিম্নলিখিত একটি লাইনারের নির্দেশ যুক্ত করার ফলে এইচটিএমএল 'অটোফোকাস' বৈশিষ্ট্যটি Angular.js এ কার্যকর হয়।

.directive('autofocus', ($timeout) => ({link: (_, e) => $timeout(() => e[0].focus())}))

এখন, আপনি কেবল এইচটিএমএল 5 অটোফোকাস সিনট্যাক্স ব্যবহার করতে পারেন:

<input type="text" autofocus>

@ স্টাফেন হ্যাঁ, তাই এটি হয়ে যায়.directive('autofocus', ['$timeout', ($timeout) => ({link: (_, e) => $timeout(() => e[0].focus())})])
মাইকেল প্লাটজ

2

এখানে কেবল একজন নবাগত, তবে আমি এই নির্দেশটি সহ একটি ui.bootstrap.modal এ কাজ করতে সক্ষম হয়েছি :

directives.directive('focus', function($timeout) {
    return {
        link : function(scope, element) {
            scope.$watch('idToFocus', function(value) {
                if (value === element[0].id) {
                    $timeout(function() {
                        element[0].focus();
                    });
                }
            });
        }
    };
});

এবং $ মোডাল.ওপেন পদ্ধতিতে আমি যে উপাদানটি ফোকাস করা উচিত তা নির্দেশ করতে ফোলিং ব্যবহার করেছি:

var d = $modal.open({
        controller : function($scope, $modalInstance) {
            ...
            $scope.idToFocus = "cancelaAteste";
    }
        ...
    });

টেম্পলেটটিতে আমার কাছে এটি রয়েছে:

<input id="myInputId" focus />

2

নিম্নলিখিত নির্দেশটি আমার জন্য কৌশলটি করেছে। ইনপুট করার জন্য একই অটোফোকাস এইচটিএমএল বৈশিষ্ট্যটি ব্যবহার করুন।

.directive('autofocus', [function () {
    return {
        require : 'ngModel',
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.focus();
        }
    };
}])

1
jQuery অন্তর্ভুক্ত না করাতে আপনি এটি চালাতে একটি ত্রুটি পাবেন তবে তার পরিবর্তে উপাদান হওয়া উচিত [0] .ফোকাস ()
রায়ান এম

2

আপনি যদি মডেলআইনস্ট্যান্স ব্যবহার করে থাকেন এবং অবজেক্টটি থাকে আপনি মডেলটি খোলার পরে ক্রিয়া করতে "তারপর" ব্যবহার করতে পারেন। আপনি যদি মডেলআইনস্ট্যান্স ব্যবহার না করে থাকেন, এবং মডেলটি খোলার জন্য হার্ড কোডেড আপনি ইভেন্টটি ব্যবহার করতে পারেন। $ সময়সীমা কোনও ভাল সমাধান নয়।

আপনি এটি করতে পারেন (বুটস্ট্রা 3):

$("#" + modalId).on("shown.bs.modal", function() {
    angular.element("[name='name']").focus();
});

ModalInstance এ আপনি ওপেন মডালের পরে কোডটি কীভাবে কার্যকর করবেন তা পাঠাগারটিতে দেখতে পারেন।

এর মতো $ টাইমআউট ব্যবহার করবেন না, $ টাইমআউট 0, 1, 10, 30, 50, 200 বা তার বেশি হতে পারে এটি ক্লায়েন্ট কম্পিউটারের উপর নির্ভর করবে এবং মোডালটি খোলার প্রক্রিয়া।

Focus সময়সীমা ব্যবহার করবেন না যখন আপনি ফোকাস করতে পারেন পদ্ধতিটি আপনাকে জানায়;)

আমি আশা করি যে এই সাহায্য! :)


2

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

module APP.Directives {

export class FocusOnLoadDirective implements ng.IDirective {
    priority = 0;
    restrict = 'A';

    constructor(private $interval:any, private $timeout:any) {

    }

    link = (scope:ng.IScope, element:JQuery, attrs:any) => {
        var _self = this;
        var intervalId:number = 0;


        var clearInterval = function () {
            if (intervalId != 0) {
                _self.$interval.cancel(intervalId);
                intervalId = 0;
            }
        };

        _self.$timeout(function(){

                intervalId = _self.$interval(function () {
                    let focusableElement = null;
                    if (attrs.focusOnLoad != '') {
                        focusableElement = element.find(attrs.focusOnLoad);
                    }
                    else {
                        focusableElement = element;
                    }
                    console.debug('focusOnLoad directive: trying to focus');
                    focusableElement.focus();
                    if (document.activeElement === focusableElement[0]) {
                        clearInterval();
                    }
                }, 100);

                scope.$on('$destroy', function () {
                    // Make sure that the interval is destroyed too
                    clearInterval();
                });

        });
    };

    public static factory = ():ng.IDirectiveFactory => {
        let directive = ($interval:any, $timeout:any) => new FocusOnLoadDirective($interval, $timeout);
        directive.$inject = ['$interval', '$timeout'];
        return directive;
    };
}

angular.module('common').directive('focusOnLoad', FocusOnLoadDirective.factory());

}

সাধারণ উপাদান ব্যবহারের উদাহরণ:

<button tabindex="0" focus-on-load />

অভ্যন্তরীণ উপাদানটির জন্য ব্যবহারের উদাহরণ (সাধারণত গতিশীল ইনজেকশন উপাদান যেমন টেম্পলেট সহ নির্দেশের জন্য):

<my-directive focus-on-load="input" />

আপনি "ইনপুট" পরিবর্তে যে কোনও jQuery নির্বাচক ব্যবহার করতে পারেন


2

আমি মার্ক রাজককের ফোকাসটি সম্পাদনা করছিএকটি উপাদানের একাধিক ফোকাসের জন্য কাজ করার দিকনির্দেশনা।

এইচটিএমএল:

<input  focus-me="myInputFocus"  type="text">

AngularJs কন্ট্রোলারে:

$scope.myInputFocus= true;

অ্যাঙ্গুল্যাএস নির্দেশিকা:

app.directive('focusMe', function ($timeout, $parse) {
    return {
        link: function (scope, element, attrs) {
            var model = $parse(attrs.focusMe);
            scope.$watch(model, function (value) {
                if (value === true) {
                    $timeout(function () {
                        scope.$apply(model.assign(scope, false));
                        element[0].focus();
                    }, 30);
                }
            });
        }
    };
});

1

এর পরিবর্তে এটি তৈরি করার পরে আরও ভাল সমাধান অনুসন্ধান করার পরে এবং এটি খুঁজে না পাওয়ার পরে আমি এই আলোচনায় অংশ নিতে চাই।

মানদণ্ড: ১. পুনঃব্যবহারযোগ্যতা বাড়াতে সমাধান পিতামাতার নিয়ন্ত্রকের সুযোগ থেকে পৃথক হওয়া উচিত। ২. কিছু শর্ত পর্যবেক্ষণ করতে $ ঘড়ির ব্যবহার এড়িয়ে চলুন, এটি উভয়ই ধীর, ডাইজেস্ট লুপের আকার বাড়ায় এবং পরীক্ষা আরও শক্ত করে তোলে। ৩. ডাইজেস্ট লুপটি ট্রিগার করতে $ সময়সীমা বা $ সুযোগ $ প্রয়োগ করুন () প্রয়োগ করুন। ৪) একটি ইনপুট উপাদান সেই উপাদানটির মধ্যে উপস্থিত থাকে যেখানে নির্দেশিকা খোলা ব্যবহৃত হয়।

এই সমাধানটি আমি সবচেয়ে পছন্দ করেছি:

নির্দেশিকা:

.directive('focusInput', [ function () {
    return {
        scope: {},
        restrict: 'A',
        compile: function(elem, attr) {
            elem.bind('click', function() {
                elem.find('input').focus();                
            });
        }        
    };
}]);

এইচটিএমএল:

 <div focus-input>
     <input/>
 </div>

আমি আশা করি এটি কাউকে সাহায্য করবে!


এইচটিএমএল "লেবেল" কী করে তা আপনি কেবল পুনরায় তৈরি করেছেন, আপনি কেবল "লেবেল" দিয়ে "ডিভ ফোকাস-ইনপুট" প্রতিস্থাপন করতে পারেন এবং নির্দেশনা থেকে মুক্তি পেতে পারেন।
frst


1

আপনি যদি নির্দিষ্ট উপাদানের উপর ফোকাস সেট করতে চান তবে নীচের পদ্ধতির ব্যবহার করতে পারেন।

  1. বলা একটি পরিষেবা তৈরি করুন focus

    angular.module('application')
    .factory('focus', function ($timeout, $window) {
        return function (id) {
            $timeout(function () {
                var element = $window.document.getElementById(id);
                if (element)
                    element.focus();
            });
        };
    });
  2. আপনি যেখান থেকে কল করতে চান তা এটিকে নিয়ামকের মধ্যে প্রবেশ করুন।

  3. এই পরিষেবাটি কল করুন।


0

আমি মনে করি নির্দেশটি অপ্রয়োজনীয়। প্রয়োজনীয় উপাদান নির্বাচন করতে এইচটিএমএল আইডি এবং শ্রেণীর বৈশিষ্ট্যগুলি ব্যবহার করুন এবং ফোকাস (বা jQuery সমতুল্য) প্রয়োগ করতে ডকুমেন্ট.জেটএলমেন্টবিআইডি বা ডকুমেন্ট.কোয়ারী নির্বাচনকারী ব্যবহার করুন।

মার্কআপ নির্বাচনের জন্য যুক্ত আইডি / ক্লাস সহ মানক এইচটিএমএল / কৌণিক নির্দেশিকা

<input id="myInput" type="text" ng-model="myInputModel" />

নিয়ন্ত্রক ইভেন্ট সম্প্রচার করে

$scope.$emit('ui:focus', '#myInput');

ইউআই সার্ভিসে ক্যোয়ারী নির্বাচনকারী ব্যবহার করে - যদি একাধিক মিল থাকে (শ্রেণীর কারণে বলুন) তবে এটি কেবল প্রথমটি ফিরে আসবে

$rootScope.$on('ui:focus', function($event, selector){
  var elem = document.querySelector(selector);
  if (elem) {
    elem.focus();
  }
});

ডাইজেস্ট চক্রকে জোর করতে আপনি $ টাইমআউট () ব্যবহার করতে চাইতে পারেন


0

স্রেফ কিছু কফিতে নিক্ষেপ করছি।

app.directive 'ngAltFocus', ->
    restrict: 'A'
    scope: ngAltFocus: '='
    link: (scope, el, attrs) ->
        scope.$watch 'ngAltFocus', (nv) -> el[0].focus() if nv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.