একটি ইনপুট মধ্যে এনজি-মডেল ফিল্টার


124

আমার কাছে একটি পাঠ্য ইনপুট রয়েছে এবং আমি ব্যবহারকারীদের ফাঁকা স্থান ব্যবহার করার অনুমতি দিতে চাই না, এবং টাইপ করা সমস্ত কিছুই ছোট হাতের মধ্যে পরিণত হবে।

আমি জানি আমাকে এনজি-মডেল যেমন ফিল্টার ব্যবহার করার অনুমতি নেই।

ng-model='tags | lowercase | no_spaces'

আমি আমার নিজস্ব নির্দেশ তৈরি করার দিকে তাকিয়েছিলাম তবে এতে ফাংশন যুক্ত করেছি $parsersএবং $formattersইনপুট আপডেট করিনি, কেবলমাত্র অন্যান্য উপাদান যা এতে ছিল ng-model

আমি বর্তমানে টাইপ করছি তার ইনপুটটি কীভাবে পরিবর্তন করতে পারি?

আমি মূলত 'ট্যাগ' বৈশিষ্ট্যটি তৈরি করার চেষ্টা করছি যা স্ট্যাকওভারফ্লোতে এখানে যেমন ঠিক তেমন কাজ করে।


যদি NG-পরিবর্তনের সঙ্গে $ সময়সীমার (..., 0) ব্যবহার করতে সাহায্য করে দেখুন stackoverflow.com/questions/12176925/...
মার্ক Rajcok

উত্তর:


28

আমি মডেল মানটি দেখার এবং এটি ধাপে ধাপে আপডেট করার পরামর্শ দেব: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p= পূর্বরূপ

একমাত্র আকর্ষণীয় ইস্যুটি স্পেসগুলি নিয়ে: ইনপুলারে অ্যাংুলারজেএস 1.0.3 এনজি-মডেলটিতে স্বয়ংক্রিয়ভাবে স্ট্রিং ট্রিম করে, তাই এটি সনাক্ত করে না যে আপনি শেষে বা শুরুতে ফাঁকা স্থান যুক্ত করলে মডেলটি পরিবর্তিত হয়েছিল (যাতে স্পেসগুলি স্বয়ংক্রিয়ভাবে আমার দ্বারা মুছে ফেলা হয় না) কোড)। কিন্তু ১.১.১-তে 'এনজি-ট্রিম' নির্দেশনা রয়েছে যা এই কার্যকারিতা ( কমিট ) অক্ষম করতে দেয় । সুতরাং আমি আপনার প্রশ্নে বর্ণিত সঠিক কার্যকারিতা অর্জনের জন্য 1.1.1 ব্যবহার করার সিদ্ধান্ত নিয়েছি।


এটি ঠিক আমি যা খুঁজছিলাম was দেখা যাচ্ছে যে আমি ইতিমধ্যে কৌণিক 1.1.1 ব্যবহার করছি
অ্যান্ড্রু ডব্লিউসি ব্রাউন

@ ভ্যালেন্টাইন, আপনার সমাধানটি উপরের মন্তব্যে উল্লেখ করে SO প্রশ্নের উপর প্রযোজ্য। ধন্যবাদ। stackoverflow.com/questions/12176925/...
মার্ক Rajcok

এই সমাধানটির খারাপ পার্শ্ব প্রতিক্রিয়া হতে পারে, নীচের অন্যান্য উত্তর দেখুন, আপনার
এটির

স্কোপ ভেরিয়েবলকে পুনরায় স্বাক্ষর করা $watchশ্রোতাদের আবার আহবান করতে বাধ্য করে। সাধারণ ক্ষেত্রে (যেখানে আপনার ফিল্টারটি আদর্শবান) আপনি প্রতিটি সংশোধন করে ফিল্টারটি দু'বার সম্পাদন করে শেষ করবেন।
দেহধারী

204

আমি বিশ্বাস করি যে AngularJS ইনপুট এবং ngModelদিকনির্দেশনার অভিপ্রায়টি হল যে অবৈধ ইনপুটটি কখনই মডেলটিতে শেষ হওয়া উচিত নয় । মডেলটি সর্বদা বৈধ হওয়া উচিত। অবৈধ মডেল থাকার সমস্যাটি হ'ল আমাদের এমন পর্যবেক্ষক থাকতে পারে যা অবৈধ মডেলের উপর ভিত্তি করে আগুন লাগায় এবং (অনুপযুক্ত) পদক্ষেপ গ্রহণ করবে।

আমি এটি দেখতে পাচ্ছি, যথাযথ সমাধানটি হ'ল $parsersপাইপলাইনটি প্লাগ ইন করা এবং নিশ্চিত করা যায় যে অবৈধ ইনপুটটি এটি মডেল হিসাবে তৈরি করে না। আমি নিশ্চিত নই আপনি কীভাবে জিনিসগুলির কাছে যাওয়ার চেষ্টা করেছিলেন বা যা আপনার পক্ষে ঠিক কাজ করে না $parsersতবে এখানে একটি সহজ নির্দেশ যা আপনার সমস্যার সমাধান করে (বা কমপক্ষে সমস্যাটি সম্পর্কে আমার বোঝা):

app.directive('customValidation', function(){
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {

       modelCtrl.$parsers.push(function (inputValue) {

         var transformedInput = inputValue.toLowerCase().replace(/ /g, ''); 

         if (transformedInput!=inputValue) {
           modelCtrl.$setViewValue(transformedInput);
           modelCtrl.$render();
         }         

         return transformedInput;         
       });
     }
   };
});

উপরের নির্দেশটি ঘোষণার সাথে সাথে এটি এর মতো ব্যবহার করা যেতে পারে:

<input ng-model="sth" ng-trim="false" custom-validation>

@ ভ্যালেন্টাইন শায়বানভ প্রস্তাবিত সমাধান হিসাবে আমরা যদি ইনপুটটির ng-trimশুরু / শেষে ফাঁকা স্থানগুলি অস্বীকার করতে চাই তবে আমাদের নির্দেশিকাটি ব্যবহার করা দরকার ।

এই পদ্ধতির সুবিধাটি হ'ল 2 গুণ:

  • মডেলটিতে অবৈধ মান প্রচার করা হয় না
  • কোনও নির্দেশিকা ব্যবহার করে বার বার পর্যবেক্ষকদের নকল করেই কোনও কাস্টমকে এই কাস্টম বৈধতা যুক্ত করা সহজ

1
আমি নিশ্চিত যে কৌতূহলপূর্ণ অংশটিmodelCtrl.$setViewValue(transformedInput); modelCtrl.$render(); ডকুমেন্টেশনের লিঙ্ক হবে: ডকস.অঙ্গুলারজেএস.আর.পিআই / এনজি.ডাইরেক্টিভ : এনজিএমডিএলজি মডেলকন্ট্রোলার আমার সলিশনের "সুরক্ষা" দেওয়ার একটি শব্দ হ'ল স্কোপ সম্পত্তিটি কেবল দর্শন থেকে নয় এবং পরিবর্তন থেকে পরিবর্তন করা যেতে পারে আমার উপায় এটি আবরণ। সুতরাং আমি মনে করি এটি কীভাবে পরিমার্জনযোগ্য হতে পারে তা একটি বাস্তব পরিস্থিতির উপর নির্ভর করে।
ভ্যালেন্টাইন শায়বানভ

2
আপনার মডেলটিতে 'ModelCtrl' কী বোঝায়?
GSto

4
আপনি কোথা থেকে ইনপুটভ্যালু পাবেন?
ডফস

2
@ জিএসটো modelCtrlহ'ল নির্দেশকের দ্বারা প্রয়োজনীয় নিয়ামক। ( require 'ngModel')
নাট-উইলকিনস

7
প্রতিটি সময় আপনি কোনও অবৈধ চরিত্র টাইপ করলে, 'বিশ্ব' লেখার চেষ্টা করুন এবং এটিকে 'হেলো ওয়ার্ল্ড'-এ সংশোধন করার চেষ্টা করুন!
হাফেজ দেওয়ানদারি

23

এই সমস্যার সমাধান হতে পারে কন্ট্রোলার পক্ষ থেকে ফিল্টার প্রয়োগ করা:

$scope.tags = $filter('lowercase')($scope.tags);

$filterনির্ভরতা হিসাবে ঘোষণা করতে ভুলবেন না ।


4
তবে আপনি যদি এটিটি সঠিকভাবে আপডেট করতে চান তবে আপনার নজর রাখতে হবে।
মিঃ মিক্কেল

এটি কেবল একবার কার্যকর করা হয়। এবং একটি ঘড়িতে যুক্ত করা সঠিক সমাধান নয় কারণ এটি এমনকি প্রাথমিকভাবে মডেলটিকে অবৈধ হতে দেয় - সঠিক সমাধানটি হ'ল মডেলের $ পার্সারগুলিতে যুক্ত করা।
icfantv

4
আপনার আমার উত্তর পছন্দ করতে হবে না, তবে এর অর্থ এটি ভুল নয়। ডাউনটা করার আগে আপনার অহংকারটি পরীক্ষা করুন।
icfantv

6

আপনি যদি কেবল পঠন ইনপুট ক্ষেত্রটি ব্যবহার করেন তবে আপনি ফিল্টার সহ এনজিও-মান ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ:

ng-value="price | number:8"

4

রূপান্তর উভয় দিক থেকেই সম্পাদিত হয়েছে তা নিশ্চিত করতে a ফর্ম্যাটর এবং $ পার্সার সংগ্রহগুলিতে উভয়ই যুক্ত করে এমন একটি নির্দেশিকা ব্যবহার করুন।

Jsfiddle এর লিঙ্ক সহ আরও তথ্যের জন্য এই অন্যান্য উত্তরটি দেখুন ।


3

আমি একই সমস্যা ছিল এবং ব্যবহার

ng-change="handler(objectInScope)" 

আমার হ্যান্ডলারে আমি নিজেকে সঠিকভাবে সংশোধন করতে অবজেক্টআইনস্কোপের একটি পদ্ধতি কল করি (মোটা ইনপুট)। কন্ট্রোলারে আমি কোথাও এটি শুরু করেছিলাম

$scope.objectInScope = myObject; 

আমি জানি এটি কোনও অভিনব ফিল্টার বা প্রহরী ব্যবহার করে না ... তবে এটি সহজ এবং দুর্দান্ত কাজ করে। এর একমাত্র ডাউন-সাইড হ'ল হ্যান্ডলারের কাছে কলটিতে অবজেক্টইনস্কোপ প্রেরণ করা হয়েছে ...


1

আপনি যদি জটিল, অ্যাসিঙ্ক ইনপুট বৈধকরণ করছেন তবে ng-modelনিজস্ব বৈধতা পদ্ধতিগুলির সাথে একটি কাস্টম শ্রেণীর অংশ হিসাবে এক স্তর বিমূর্ত করা এটি উপযুক্ত।

https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview

এইচটিএমএল

<div>

  <label for="a">input a</label>
  <input 
    ng-class="{'is-valid': vm.store.a.isValid == true, 'is-invalid': vm.store.a.isValid == false}"
    ng-keyup="vm.store.a.validate(['isEmpty'])"
    ng-model="vm.store.a.model"
    placeholder="{{vm.store.a.isValid === false ? vm.store.a.warning : ''}}"
    id="a" />

  <label for="b">input b</label>
  <input 
    ng-class="{'is-valid': vm.store.b.isValid == true, 'is-invalid': vm.store.b.isValid == false}"
    ng-keyup="vm.store.b.validate(['isEmpty'])"
    ng-model="vm.store.b.model"
    placeholder="{{vm.store.b.isValid === false ? vm.store.b.warning : ''}}"
    id="b" />

</div>

কোড

(function() {

  const _ = window._;

  angular
    .module('app', [])
    .directive('componentLayout', layout)
    .controller('Layout', ['Validator', Layout])
    .factory('Validator', function() { return Validator; });

  /** Layout controller */

  function Layout(Validator) {
    this.store = {
      a: new Validator({title: 'input a'}),
      b: new Validator({title: 'input b'})
    };
  }

  /** layout directive */

  function layout() {
    return {
      restrict: 'EA',
      templateUrl: 'layout.html',
      controller: 'Layout',
      controllerAs: 'vm',
      bindToController: true
    };
  }

  /** Validator factory */  

  function Validator(config) {
    this.model = null;
    this.isValid = null;
    this.title = config.title;
  }

  Validator.prototype.isEmpty = function(checkName) {
    return new Promise((resolve, reject) => {
      if (/^\s+$/.test(this.model) || this.model.length === 0) {
        this.isValid = false;
        this.warning = `${this.title} cannot be empty`;
        reject(_.merge(this, {test: checkName}));
      }
      else {
        this.isValid = true;
        resolve(_.merge(this, {test: checkName}));
      }
    });
  };

  /**
   * @memberof Validator
   * @param {array} checks - array of strings, must match defined Validator class methods
   */

  Validator.prototype.validate = function(checks) {
    Promise
      .all(checks.map(check => this[check](check)))
      .then(res => { console.log('pass', res)  })
      .catch(e => { console.log('fail', e) })
  };

})();

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