Angularjs: ইনপুট [পাঠ্য] এনজি চেঞ্জ করুন যখন মান পরিবর্তন হচ্ছে


92

মান পরিবর্তন করার সময় এনজিচেন্জ গুলি চালাচ্ছে (এনজিচেনজ ক্লাসিক অন চেঞ্জ ইভেন্টটির সাথে সমান নয়)। আমি কীভাবে ক্লাসিক অন চেঞ্জ ইভেন্টটি কৌণিকর সাথে আবদ্ধ করতে পারি, এটি কেবল তখনই প্রকাশিত হবে যখন সামগ্রীগুলি সরিয়ে নেওয়া হবে?

বর্তমান বাঁধাই:

<input type="text" ng-model="name" ng-change="update()" />

ঠিক তেমন কিছু সন্ধান করছি এবং এটি আমার কাছে ঘটেছিল যে আপনি ক্ষেত্রটি বৈধ হলে কেবল আপডেট করার বিষয়ে বিবেচনা করতে পারেন। এইভাবে ব্যবহারকারী বৈধ ফর্ম্যাটে ইনপুট পাওয়ার সাথে লড়াই করতে পারে (বা আপনি তাদের প্রম্পট এবং ফিল্টারগুলি দিয়ে সহায়তা করতে পারেন) তবে তারা যখন এটি সঠিক হবে তখন আপনি তাদের একটি আপডেট দিয়ে পুরস্কৃত করতে পারেন!
স্টিভ ব্ল্যাক

একটি আরও নমনীয় সমাধান যা ইভেন্টটি ব্যবহার করার জন্য (শুধুমাত্র অস্পষ্ট নয়) এবং অন্যান্য বৈশিষ্ট্যগুলি খুব শীঘ্রই কৌণিকের
তারযুক্ত_

উত্তর:


96

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

এখানে এমন একটি ফ্রিডল যা নতুন এনজি-মডেল-অন-ব্লার নির্দেশনার সাথে এনজি-পরিবর্তন দেখায় working নোট করুন এটি মূল ঝাঁকুনির জন্য একটি সামান্য টুইট ।

আপনি যদি নিজের কোডটিতে নির্দেশিকা যুক্ত করেন তবে আপনি আপনার বাধ্যবাধকতা এতে পরিবর্তন করবেন:

<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />

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

// override the default input to update on blur
angular.module('app', []).directive('ngModelOnblur', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        priority: 1, // needed for angular 1.2.x
        link: function(scope, elm, attr, ngModelCtrl) {
            if (attr.type === 'radio' || attr.type === 'checkbox') return;

            elm.unbind('input').unbind('keydown').unbind('change');
            elm.bind('blur', function() {
                scope.$apply(function() {
                    ngModelCtrl.$setViewValue(elm.val());
                });         
            });
        }
    };
});

দ্রষ্টব্য: যেমন @ wjin নীচের মন্তব্যে উল্লেখ করেছে এই বৈশিষ্ট্যটি সরাসরি কৌনিক 1.3 (বর্তমানে বিটাতে) এর মাধ্যমে সমর্থিত ngModelOptions। আরও তথ্যের জন্য ডক্স দেখুন ।


4
সতর্কতা, এলম.উনবাইন্ড ('ইনপুট') ইন্টারনেট এক্সপ্লোরার 8 এ একটি 'টাইপআরর' ছুঁড়েছে যাতে অন্যান্য আনবাইন্ড বিবৃতি মোটেও কার্যকর করা হবে না। আমি এটিকে elm.unbind ('ইনপুট') আলাদা লাইনে নিয়ে গিয়ে চেষ্টা করেছি / ক্যাপ ব্লক দিয়ে এটিকে ঘিরে রেখেছি।
রব জুউরলিংক

4
কৌনিক 1.2 এর একটি ng-blurনির্দেশনা রয়েছে: docs.angularjs.org/api/ng.directive:ngBurur
জেজে জব্বার

4
আমি এই কোডটি কাজ করেছি, তবে আমাকে নির্দেশের অগ্রাধিকার (যেমন অগ্রাধিকার: 100) নির্ধারণ করতে হয়েছিল। আমি কৌনিক 1.2.10 ব্যবহার করছি। আমার অনুমান যে এনজিএমডেল অনব্লুর নির্দেশনাটি এনজিএমডেলের নির্দেশের আগে চলছিল তাই আনবাইন্ড করার মতো কিছুই এখনও ছিল না। এছাড়াও, এই পৃষ্ঠাটি দেখে মনে হচ্ছে ভবিষ্যতে এর জন্য কোনও বিলম্ব
অ্যালান ওয়েস্ট

4
উল্লেখ্য কৌণিক 1.3 মধ্যে অন্তত এই কার্যকারিতা মাধ্যমে ডিফল্ট বাস্তবায়ন সমর্থিত ng-model-options="{ updateOn: 'default blur' }"দেখুন ডকুমেন্টেশন
wjin

4
@ রবজুরলিংক (বা অন্য কেউ যারা 'ইনপুট'-এ আবদ্ধ বা আবদ্ধ করার চেষ্টা করার সময় আইই 8' টাইপআর'র মুখোমুখি হন) - অ্যাংুলারের উত্সটি দেখে আপনি দেখতে পাবেন যে তারা $snifferব্রাউজারটি 'ইনপুট' সমর্থন করে কিনা এবং যদি না, তারা 'কীডাউন' এ ফিরে যায়। যদি আপনি যদি $sniffer.hasEvent('input')সত্যটি ফিরে আসে তবে কেবল 'ইনপুট' আনবাইন্ডের উপরের নির্দেশটি আপডেট করেন - তবে আপনি সেই ত্রুটিটি এড়াতে পারেন এবং এখনও
আইই

33

এটি অ্যাঙ্গুলারজেএস-এ সাম্প্রতিক সংযোজন সম্পর্কে, ভবিষ্যতের উত্তর হিসাবে পরিবেশন করতে ( অন্য প্রশ্নের জন্যও )।

কৌণিকর নতুন সংস্করণ (এখন ১.৩ বিটাতে), কৌণিক জেএস স্থানীয়ভাবে এই বিকল্পটিকে সমর্থন করে ngModelOptions, পছন্দ করে

ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"

এনজিএমডেলঅ্যাপশন ডক্স

উদাহরণ:

<input type="text" name="username"
       ng-model="user.name"
       ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />

এটি 1.3 বিটা 5 এ সঠিকভাবে কাজ করে না, তবে বর্তমানের মাস্টার বিল্ড 2602 এ স্থির হয়েছে
মানিকান্ত

আর সে কারণেই এটি এখনও বিটাতে রয়েছে এবং "রিয়েল-ওয়ার্ল্ড" অ্যাপ্লিকেশনগুলিতে ব্যবহারযোগ্য নয় যেমন আমি এখনই তৈরি করছি।
রিপার_ইউনিক

এখানে কৌণিক 1.2.x জন্য মডিউল মতো NG মডেল-অপশন এর github.com/fergaldoyle/modelOptions
Fergal

8

অন্য ক্ষেত্রে কেউ অতিরিক্ত খুঁজছেন কীপ্রেস সমর্থন "এন্টার", এখানে একটি আপডেট এর বেহালার দ্বারা উপলব্ধ Gloppy

কিপ্রেস বাইন্ডিংয়ের জন্য কোড:

elm.bind("keydown keypress", function(event) {
    if (event.which === 13) {
        scope.$apply(function() {
            ngModelCtrl.$setViewValue(elm.val());
        });
    }
});

5

আইই 8 এর সাথে লড়াই করা প্রত্যেকের জন্য (এটি আনবাইন্ড ('ইনপুট') পছন্দ করে না, আমি এর চারপাশে একটি উপায় খুঁজে পেয়েছি।

আপনার নির্দেশ এবং ব্যবহারের মধ্যে স্ফুলার ইনজেকশন করুন:

if($sniffer.hasEvent('input')){
    elm.unbind('input');
}

আপনি যদি এটি করেন তবে আইই 8 শান্ত হয় :)


বা কেবল চেষ্টা করুন / ধরুন
ওয়্যারড_ ইন

4

আমার জ্ঞান অনুযায়ী আমাদের নির্বাচন বিকল্পের সাথে এনজি-পরিবর্তন ব্যবহার করা উচিত এবং পাঠ্যবক্সের ক্ষেত্রে আমাদের এনজি-ব্লার ব্যবহার করা উচিত।


এটি এখনই সঠিক উত্তর, যখন তখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল এটি আপাতভাবে উপস্থিত ছিল না।
ডাউনহ্যান্ড

আপনাকে অনেক ধন্যবাদ ...
এটির

3

স্কোপ ভেরিয়েবলের পরিবর্তনগুলি আরও ভালভাবে প্রতিস্থাপন করতে ঘড়িটি ব্যবহার করছেন না?


4
চিন্তার জন্য খাদ্য: benlesh.com/2013/10/title.html (শিরোনাম: আপনার সম্ভবত আপনার নিয়ন্ত্রণকারীগুলিতে ঘড়ি ব্যবহার করা উচিত নয়)
বেনবি

0

চেঞ্জের আচরণটি ডিফল্ট ইনপুটটিকে ওভাররাইড করুন (নিয়ন্ত্রণের ক্ষতির ফোকাস এবং মান পরিবর্তিত হলেই ফাংশনটি কল করুন)

দ্রষ্টব্য: এনজিচেনজ ক্লাসিক অন চেঞ্জ ইভেন্টের মতো নয় যা ইভেন্টটি পরিবর্তন করছে যখন মান পরিবর্তন হচ্ছে এই নির্দেশিকাটি উপাদানটির মান সংরক্ষণ করে যখন এটি ফোকাস পায় তখন এটি অন্বেষণ করে
এটি পরীক্ষা করে নতুন মানটি পরিবর্তিত হয়েছে কিনা এবং যদি তাই ঘটনাটি প্রজ্বলিত হয় cks

@ পরিম {স্ট্রিং} - ফাংশনটির নামটি "অন চেঞ্জ" থেকে বরখাস্ত করা উচিত inv

@ উদাহরণ <ইনপুট আমার-অন-চেঞ্জ = "মাইফঙ্ক" এনজি-মডেল = "মডেল">

angular.module('app', []).directive('myOnChange', function () { 
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            myOnChange: '='
        },
        link: function (scope, elm, attr) {
            if (attr.type === 'radio' || attr.type === 'checkbox') {
                return;
            }
            // store value when get focus
            elm.bind('focus', function () {
                scope.value = elm.val();

            });

            // execute the event when loose focus and value was change
            elm.bind('blur', function () {
                var currentValue = elm.val();
                if (scope.value !== currentValue) {
                    if (scope.myOnChange) {
                        scope.myOnChange();
                    }
                }
            });
        }
    };
});

0

আমার ঠিক একই সমস্যা ছিল এবং এটি আমার পক্ষে কাজ করেছিল। যোগ করুন ng-model-updateএবং ng-keyupআপনি যেতে ভাল! এখানে ডক্স রয়েছে

 <input type="text" name="userName"
         ng-model="user.name"
         ng-change="update()"
         ng-model-options="{ updateOn: 'blur' }"
         ng-keyup="cancel($event)" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.