কৌণিকভাবে ম্যানুয়ালি পরিবর্তন সনাক্তকরণ ট্রিগার করছে ing


387

আমি একটি কৌণিক উপাদান লিখছি যার একটি সম্পত্তি আছে Mode(): string

আমি এই সম্পত্তিটি কোনও প্রোগ্রামের প্রতিক্রিয়া হিসাবে না করে প্রোগ্রামটিমেটিকভাবে সেট করতে সক্ষম হতে চাই।

সমস্যাটি হ'ল ব্রাউজার ইভেন্টের অভাবে, একটি টেম্পলেট বাইন্ডিং {{Mode}}আপডেট হয় না।

এই পরিবর্তন সনাক্তকরণটিকে ম্যানুয়ালি ট্রিগার করার কোনও উপায় আছে কি?

উত্তর:


640

এর মধ্যে একটি ব্যবহার করে দেখুন:

  • ApplicationRef.tick()- অ্যাঙ্গুলারজেএস এর অনুরূপ $rootScope.$digest()- অর্থাত্ সম্পূর্ণ উপাদান গাছটি পরীক্ষা করুন
  • NgZone.run(callback)- এর অনুরূপ $rootScope.$apply(callback)- যেমন, কৌণিক অঞ্চলের ভিতরে কলব্যাক ফাংশনটি মূল্যায়ন করুন। আমি মনে করি, তবে আমি নিশ্চিত নই, এটি কলব্যাক ফাংশনটি সম্পাদন করার পরে সম্পূর্ণ উপাদান গাছ পরীক্ষা করে শেষ করবে।
  • ChangeDetectorRef.detectChanges()- এর অনুরূপ $scope.$digest()- যেমন কেবলমাত্র এই উপাদান এবং তার শিশুদের পরীক্ষা করুন

আপনি উদ্বুদ্ধ করতে পারেন ApplicationRef, NgZoneঅথবা ChangeDetectorRefআপনার উপাদান মধ্যে।


1
ধন্যবাদ, আমি তৃতীয় সমাধানটি বেছে নিয়েছিলাম যাতে সমস্ত কিছু পরীক্ষা না করা, কারণ পরিবর্তনগুলি মোটামুটি স্থানীয়করণ করা হয়। আমার বেশি সময় লাগলে আমার অন্যান্য বিকল্পগুলি তদন্ত করা উচিত। প্রতিটি পছন্দ সঙ্গে কোন কার্যকারিতা জড়িত আছে?
jz87

36
+1 এর জন্য ChangeDetectorRef.detectChanges()। আমার নির্দেশিকা কোনও ইনপুটটির মান আপডেট করতে পারার আগে বৈধতা প্রদানকারীরা গুলি চালিয়ে যাচ্ছিল।
PS2goat

7
অ্যাপ্লিকেশনরিফ.টিক () এবং চেঞ্জডেেক্টরআরএফ.ডিটেকট চেঞ্জস () এখনও 2.0.0 ফাইনালে উপস্থিত রয়েছে।
ম্যাক্স ম্যামফোর্ড

51
ভেবেছিলাম আমি এটি উল্লেখ করব। এগুলি স্থির পদ্ধতি নয়, এগুলি উদাহরণ পদ্ধতি। আপনাকে এই ক্লাসগুলি পরিষেবা হিসাবে ইনজেকশনের প্রয়োজন হবে।
স্টিফেন পল

1
অ্যাপ্লিকেশন র‌্যাফ.টিক () ফায়ারফক্স ভি 17 (<20)
ড্যান জে

123

আমি স্বীকৃত উত্তর রেফারেন্স ব্যবহার করেছি এবং একটি উদাহরণ রাখতে চাই, যেহেতু কৌণিক 2 ডকুমেন্টেশন পড়া খুব কঠিন, আমি আশা করি এটি আরও সহজ:

  1. আমদানি NgZone:

    import { Component, NgZone } from '@angular/core';
    
  2. এটি আপনার শ্রেণি নির্মাতার সাথে যুক্ত করুন

    constructor(public zone: NgZone, ...args){}
    
  3. এর সাথে রান কোড zone.run:

    this.zone.run(() => this.donations = donations)
    

6
আপনার zone.runকোডটি কোথায় রাখা উচিত এবং ঠিক কী donations?
সুকু

@ সুকু অনুদান হ'ল এমন কোনও সম্পত্তি যা আপনি আপডেট করতে চান তাই এটি এটি.ফু = বার হতে পারে। জোন.আরুন আপনি যেখানে স্টাফ আপডেট করতে চান সেখানে যান।
ম্যাথিউ

4
ডকুমেন্ট.এডডেন্টেন্টলিস্টনার ("পুনরায় শুরু করুন", কলব্যাক) ব্যবহার করার সময় আমি এই সমাধানটি একটি ভিউ আপডেটে জোর করার জন্য ব্যবহার করেছি
মারকোভটওয়ট

71

আমি মার্কফোরচেক () দিয়ে এটি আপডেট করতে সক্ষম হয়েছি

আমদানি করুনপরিবর্তনকারী

import { ChangeDetectorRef } from '@angular/core';

ইনজেক্ট করুন এবং এটি ইনস্ট্যান্টিয়েট করুন

constructor(private ref: ChangeDetectorRef) { 
}

অবশেষে স্থান পরিবর্তন করতে সনাক্তকরণ চিহ্নিত করুন

this.ref.markForCheck();

এখানে একটি উদাহরণ রয়েছে যেখানে মার্কফোর্ড () কাজ করে এবং সনাক্ত করে চেঞ্জস () না করে।

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

সম্পাদনা: এই উদাহরণটি সমস্যাটিকে আর চিত্রিত করে না :( আমি বিশ্বাস করি এটি সম্ভবত এটি একটি নতুন কৌণিক সংস্করণটি চালাচ্ছে যেখানে এটি স্থির হয়েছে।

(এটি আবার চালানোর জন্য স্টপ / আরআন টিপুন)


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

2
মনে হচ্ছে ডিটেনচেনজগুলি আসলে এই প্লঙ্কারটিতে কাজ করছে? আমি কিছু অনুপস্থিত করছি?
জারেড_সি

1
আপনার অবশ্যই লক্ষ্য করা উচিত যে চেঞ্জডেক্টরআরফ কেবল উপাদানগুলিতে কাজ করে
কেভিনিনিস

(!) এটি একটি খারাপ উদাহরণ, আমি দুঃখিত। উদাহরণ কিছুই দেখায় না। প্রথম আইটেমটি কেবল ওভাররাইট করা হবে। কেবলমাত্র টাইমারগুলিকে কিছুটা সামঞ্জস্য করুন ...
পিটার স্টিগনার

এই উদাহরণটিতে আর সমস্যা চিত্রিত করে না :( আমি বিশ্বাস করি যেখানে এটি সংশোধন করা হচ্ছে একটি নতুন কৌণিক সংস্করণে চলছে করা হতে পারে।
Nuno টমাস

7

কৌণিক 2+ এ, @ ইনপুট সাজসজ্জার চেষ্টা করুন

এটি পিতা-মাতার এবং সন্তানের উপাদানগুলির মধ্যে কিছু দুর্দান্ত সম্পত্তি বাধ্যতামূলক করার অনুমতি দেয়।

প্রথমে সন্তানের কাছে স্থান দেওয়া হবে এমন বস্তু / সম্পত্তি ধরে রাখতে পিতা-মাতার মধ্যে একটি বৈশ্বিক পরিবর্তনশীল তৈরি করুন।

পরবর্তী পিতামাতার কাছ থেকে পাস করা বস্তু / সম্পত্তি ধরে রাখতে সন্তানের মধ্যে একটি বৈশ্বিক পরিবর্তনশীল তৈরি করুন।

তারপরে প্যারেন্ট এইচটিএমএল, যেখানে শিশু টেম্পলেট ব্যবহৃত হয়, সেখানে শিশু ভেরিয়েবলের নামের সাথে বর্গক্ষেত্র বন্ধনীর চিহ্ন চিহ্নিত করুন, তারপরে এটি প্যারেন্ট ভেরিয়েবলের নামের সমান সেট করুন। উদাহরণ:

<child-component-template [childVariable] = parentVariable>
</child-component-template>

অবশেষে, যেখানে সন্তানের সম্পত্তি সন্তানের উপাদানগুলিতে সংজ্ঞায়িত করা হয়েছে, ইনপুট ডিকোরিটার যুক্ত করুন:

@Input()
public childVariable: any

যখন আপনার প্যারেন্ট ভেরিয়েবলটি আপডেট হয়, তখন এটি চাইল্ড উপাদানগুলিতে আপডেটগুলি পাস করে, যা এটির এইচটিএমএল আপডেট করবে।

এছাড়াও, সন্তানের উপাদানগুলিতে কোনও ক্রিয়াকলাপ শুরু করতে, এনজিওনচেন্জে একবার দেখুন।


2
না ... সমস্যাটি স্থির করে না ... আপনি যদি পিতামাতাকে আপডেট করেন ... এক্সটামেলের জন্য বলুন একটি স্থির পদ্ধতিতে "রেফারেন্স দ্বারা" আপডেট করা হয় শিশুটি এটি সনাক্তকরণের পরিবর্তন হিসাবে আবিষ্কার না করায় এটি গ্রহণ করবে
ভাইল

আমি এখন কয়েক দিন একই সমস্যা পেয়েছি। আমি পিএইচপি ব্যাকএন্ড থেকে ডেটা পুনরুদ্ধার করার চেষ্টা করি এবং ডেটা একেবারেই আপডেট হয় না। মাইক্রোসফ্ট এজ এ ঠিক কাজ করে তবে অন্য ব্রাউজারে এটি হয় না। আমি প্রথম শুরুতে থাকা ডেটা পেয়ে যাচ্ছি তবে ডেটা পরিবর্তন হলে তা দেখার পরিবর্তে আপডেট হয় না
el6976

1

ChangeDetectorRef.detectChanges () - $ সুযোগের মতো $ ডাইজেস্ট () - যেমন কেবলমাত্র এই উপাদান এবং এর শিশুদের পরীক্ষা করুন

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