অ্যাঙ্গুলারজেএস: এনজি-মডেল বন্ডিং যখন jQuery এর সাথে পরিবর্তিত হবে তখন আপডেট হচ্ছে না


100

এটি আমার এইচটিএমএল:

<input id="selectedDueDate" type="text" ng-model="selectedDate" />

আমি যখন বাক্সে টাইপ করি তখন মডেলটি 2-উপায়-বন্ধন ব্যবস্থার মাধ্যমে আপডেট করা হয়। মিষ্টি।

তবে আমি যখন জিকুয়েরির মাধ্যমে এটি করি ...

$('#selectedDueDate').val(dateText);

এটি মডেলটি আপডেট করে না। কেন?


4
আপনি দ্বিতীয়টি কেন শুরু করবেন? আপনি একটি কাঠামো ব্যবহার করছেন এবং তারপরে এটিকে বাইপাস করার সিদ্ধান্ত নেবেন এবং ডিওএম ম্যানিপুলেশনের মাধ্যমে মানটি সেট করবেন। প্রাথমিক পরামর্শদাতারা কৌনিক দিয়ে সেরা পরামর্শ দিতে পারেন: ভুলে যাবেন জ্যাকুয়েরি বিদ্যমান। 90% ক্ষেত্রে কৌণিক পর্যাপ্ত হবে এবং বাকি 10% নির্দেশের লিঙ্কের ভিতরে জকিলাইটের মাধ্যমে অর্জন করা যেতে পারে (উপাদানটি আসলে জেকলাইট মোড়ানো উপাদান হেরফেরের জন্য প্রস্তুত)।
অকার্যকর

4
খুব গুরুত্বপূর্ণ প্রশ্ন
সৈয়দ মোঃ কামরুজ্জামান

ডোম ম্যানিপুলেশনের সাথে কৌণিক মডেলগুলি পরিবর্তন করতে আপনি খুব ভাল কারণগুলি পেতে পারেন, সম্ভবত আপনি কোনও ডি / এ / বি পরীক্ষার সরঞ্জাম নিয়ে কাজ করছেন এবং পর্দার পিছনে ফর্মগুলি পূরণ করতে চান, বা আপনি গ্রিসমোনকি স্ক্রিপ্টে কাজ করছেন ফর্মগুলি স্বতঃপূর্ণ করতে।
শাদাইজ

উত্তর:


135

কৌনিকটি সেই পরিবর্তন সম্পর্কে জানে না। এর জন্য আপনার কল করা উচিত $scope.$digest()বা এর ভিতরে পরিবর্তন করা উচিত $scope.$apply():

$scope.$apply(function() { 
   // every changes goes here
   $('#selectedDueDate').val(dateText); 
});

দেখুন এই ভালভাবে বুঝতে মলিন-পরীক্ষণ

আপডেট : এখানে একটি উদাহরণ


আমি আপনার মত এই প্রণীত বলে, fiddle.jshell.net/AladdinMhaimeed/agvTz/8 কিন্তু এটা কাজ করে না
আলাদিন Mhemed

4
এই fiddle.jshell.net/agvTz/38 দেখুন আপনার " function$ সুযোগ" call কল করা উচিত আর্গুমেন্ট হিসাবে কোনও ফাংশন পাস করার আবেদন করুন। এবং $ প্রয়োগ কল করা উচিত যখন আপনি $ স্কোপটিতে পরিবর্তনগুলি করবেন, সুতরাং অনসलेक्टের অভ্যন্তরে। আহ, আমি প্রত্যাশা করি যে আপনি উদাহরণস্বরূপ কন্ট্রোলারের ভিতরে ডিওএম ম্যানিপুলেশন রেখেছেন, সত্যিকারের অ্যাপ্লিকেশনটিতে এটি ভুল is)
রেনান তোমল ফার্নান্দেস

তাহলে ভাল কৌণিক অনুশীলন করার জন্য আমার কী করা উচিত? একটি নির্দেশিকা মধ্যে পৃথক DOM হেরফের?
আলাদীন মেহেদ

4
হ্যাঁ, এখানে একটি উদাহরণ fiddle.jshell.net/agvTz/39 নির্দেশ আপনি একটি সহজ সাথে করতে চান অনেক বার হিসাবে ব্যবহার করা যেতে পারে datepicker="scopeKeyThatYouWant"ইনপুটে
Renan তমাল ফার্নান্ডেজ

নিষ্পত্তি করার জন্য কেবল .. $ সুযোগ। $ ডাইজেস্ট () কল করুন। এটা কি ধীর হয়ে যাবে?
ঠাট জিন

29

শুধু ব্যবহার;

$('#selectedDueDate').val(dateText).trigger('input');

আমি trigger('input')এর onSelectইভেন্টে একটি ডেটপিকার ব্যবহার করেছি । এটি মানটি সঠিকভাবে আপডেট করে।
ইমান

এটি আমার জন্য কৌশলটি করেছে। আমি একটি নির্দেশিকা পরীক্ষা থেকে একটি বাউন্ড ইনপুটটির মান আপডেট করেছিলাম এবং কোনও .val('something'কলটি মোড়ানো $apply(বা $digestপরে কল করা) কাজ করে না।
টম সেল্ডন

4
ঘন্টার পর ঘন্টা অনুসন্ধান করার পরে, এই সেই কাজ করেছিল! ধন্যবাদ!
ড্যান 18

আলহামদুলিল্লাহ, নিখুঁত, এটি আমার পক্ষে কাজ করছে। আমার ঘন্টা বাঁচানোর জন্য ধন্যবাদ
সৈয়দ মোঃ কামরুজ্জামান

সত্য। আমি ব্যবহার করছিলাম $('#selectedDueDate').val(dateText).trigger('change');যা আমার পক্ষে কাজ করে না। .trigger('input');যাদু এর মত কাজ করে
jafarbtech

17

আমি খুঁজে পেয়েছি যে আপনি যদি পরিবর্তনটি সরাসরি স্কোপের বিপরীতে না রাখেন তবে এটি আরও নির্ভরযোগ্যভাবে আপডেট হয়।

কিছু "তারিখবজ.স্লেজডেট" ব্যবহার করার চেষ্টা করুন এবং নিয়ামকটিতে নির্বাচিত তারিখটিকে একটি ডেটঅবজ অবজেক্টে যুক্ত করুন:

$scope.dateObj = {selectedDate: new Date()}

এটি আমার পক্ষে কাজ করেছে।


4
এটি আমার পক্ষেও কাজ করেছিল। দ্বিমুখী বাইন্ডিং কেন কাজ করছে না তা জানার চেষ্টা করে আমি ২ ঘন্টা সময় নষ্ট করেছি। এটি পৃষ্ঠায় দুর্দান্ত কাজ করেছে, তবে নিয়ামকের সুযোগটি আপডেট করা হচ্ছে না। তারপরে আমি হতাশার বাইরে আপনার পদ্ধতির চেষ্টা করেছি (কারণ এটি আমার কাছে কোনও সত্য নয় যে এটি সত্য হওয়া উচিত) এবং গরম জঘন্য কাজটি কার্যকর হয়েছিল! ধন্যবাদ!
টিএমসি

4
এখানে একই - কোনও কৌণিক জে গুরু কীভাবে এটি কাজ করে তা ব্যাখ্যা করতে পারেন? এটি দেখার মতো এটির নিজের নেস্টেড সুযোগ রয়েছে এবং কখনও কখনও আপনি কেবল দর্শন-সুযোগকে আপডেট করতে গিয়ে আটকে যান, নিয়ামক-সুযোগ নয়
টম কার্ভার

4
আমার জন্য ভাল কাজ করে! আমি ভাবছি কেন হেকের মধ্যে এটি খালি সুযোগে একই রকম কাজ করে না।
স্টিফেন

4
এটি কৌণিকের সাথে সামান্যই করার আছে এবং জাভাস্ক্রিপ্ট কীভাবে কাজ করে তার সাথে অনেক কিছু করার দরকার। যখন আপনি কোনও অবজেক্টের জন্য স্কোপ ভেরিয়েবল নির্ধারণ করেন, আপনি যখন কোনও ভেরিম আদিম মানের সমান হিসাবে সেট করা হয় তখন মান দ্বারা বিপরীত হিসাবে আপনি রেফারেন্স দ্বারা এটি বরাদ্দ করেন। আমি এখানে আমার পোস্টে এটি সম্পর্কে কথা বললাম। stackoverflow.com/questions/14527377/… । আমি এই পোস্টটি plnkr.co/edit/WkCT6aYao3qCmzJ8t5xg?p= পূর্বরূপ চিত্রিত করার জন্য এই পোস্টটি উল্লেখ করেছি
নিক ব্র্যাডি

4

এটা চেষ্টা কর

var selectedDueDateField = document.getElementById("selectedDueDate");
var element = angular.element(selectedDueDateField);
element.val('new value here');
element.triggerHandler('input');

যখন আপনার কৌণিক নিয়ন্ত্রণকারী $ স্কোপটিতে অ্যাক্সেস না থাকে তখন এটি ব্যবহারযোগ্য us আপনি যখন টেম্পারমনকি দিয়ে কোনও স্ক্রিপ্ট লেখেন, উদাহরণস্বরূপ।
wassertim


2

কৌণিক স্কোপের বাইরে যা কিছু ঘটে না কেন, কৌনিকটি কখনই তা জানতে পারে না।

ডাইজেস্ট চক্রটি মডেল -> নিয়ামক এবং তারপরে নিয়ামক -> মডেল থেকে পরিবর্তনগুলি রাখে।

আপনি যদি সর্বশেষতম মডেলটি দেখতে চান তবে আপনার ডাইজেস্ট চক্রটি ট্রিগার করতে হবে

তবে একটি ডাইজেস্ট চক্রের অগ্রগতি হওয়ার সম্ভাবনা রয়েছে, তাই আমাদের চক্রটি পরীক্ষা করা এবং সূচনা করা দরকার।

সাধারণত, সর্বদা একটি নিরাপদ প্রয়োগ করুন।

       $scope.safeApply = function(fn) {
            if (this.$root) {
                var phase = this.$root.$$phase;
                if (phase == '$apply' || phase == '$digest') {
                    if (fn && (typeof (fn) === 'function')) {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            }
        };


      $scope.safeApply(function(){
          // your function here.
      });

1

কৌণিক জেএস স্ট্রিং, সংখ্যা এবং বুলিয়ানগুলি মান দ্বারা পাস করে যখন এটি অ্যারে এবং অবজেক্টগুলিকে রেফারেন্স দিয়ে পাস করে। সুতরাং আপনি একটি খালি অবজেক্ট তৈরি করতে এবং আপনার তারিখটিকে সেই অবজেক্টের সম্পত্তি হিসাবে তৈরি করতে পারেন। এই ভাবে কৌণিক মডেল পরিবর্তনগুলি সনাক্ত করবে।

নিয়ামক মধ্যে

app.module('yourModule').controller('yourController',function($scope){
$scope.vm={selectedDate:''}
});

এইচটিএমএলে

<div ng-controller="yourController">
<input id="selectedDueDate" type="text" ng-model="vm.selectedDate" />
</div>

1

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

$("#myInput")[0].dispatchEvent(new Event("input", { bubbles: true })); //Works

অনুসরণ কাজ করে না

$("#myInput").trigger("change"); // Did't work for me

সিন্থেটিক ইভেন্টগুলি তৈরি এবং প্রেরণ সম্পর্কে আপনি আরও পড়তে পারেন ।


0

আমি এই ছোট প্লাগইনটি jQuery এর জন্য লিখেছি যা .val(value)উপস্থিত থাকলে কৌণিক উপাদানটি আপডেট করার জন্য সমস্ত কল করবে :

(function($, ng) {
  'use strict';

  var $val = $.fn.val; // save original jQuery function

  // override jQuery function
  $.fn.val = function (value) {
    // if getter, just return original
    if (!arguments.length) {
      return $val.call(this);
    }

    // get result of original function
    var result = $val.call(this, value);

    // trigger angular input (this[0] is the DOM object)
    ng.element(this[0]).triggerHandler('input');

    // return the original result
    return result; 
  }
})(window.jQuery, window.angular);

এই স্ক্রিপ্টটি কেবল jQuery এবং কৌণিক.জেএস পরে পপ করুন এবং val(value)আপডেটগুলি এখন দুর্দান্ত খেলতে হবে।


সংক্ষিপ্ত সংস্করণ:

!function(n,t){"use strict";var r=n.fn.val;n.fn.val=function(n){if(!arguments.length)return r.call(this);var e=r.call(this,n);return t.element(this[0]).triggerHandler("input"),e}}(window.jQuery,window.angular);

উদাহরণ:


এই উত্তরটি একই অনুরূপ প্রশ্নের আমার উত্তর থেকে কপিরাইট করা হয়েছিল ।


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