এমভিভিএম-এ রাষ্ট্র পরিচালনার জন্য কি কোনও ভাল আনুষ্ঠানিক প্যাটার্ন রয়েছে?


21

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

রেডাক্সের কয়েকটি সাধারণ নীতি রয়েছে যা নির্দেশ করে যে কীভাবে রাজ্য পরিচালনা করা উচিত, ইউআই আপডেটগুলি তৈরি করে, ইভেন্ট হ্যান্ডলিং করে এবং রাষ্ট্র পরিবর্তনগুলি আরও বেশি পূর্বাভাসযোগ্য। নীতিগুলি হ'ল:

  • সত্যের একক উত্স (সমস্ত পরিবর্তনীয় স্থিতি একটি একক ভাগ করা বস্তুতে সঞ্চিত)।
  • রাষ্ট্র কেবল পঠনযোগ্য। কোডের মাধ্যমে আউটপুট দ্বারা এটি সংশোধন করা যায় না, যা সাধারণত ডাব্লুপিএফ-এ ঘটে।
  • রাষ্ট্র কেবল খাঁটি ফাংশন দ্বারা পরিবর্তিত হতে পারে।

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

আমি আন্ত-সম্পর্কিত ভিউমোডেল উপাদানগুলির মধ্যে একে অপরকে আপডেট করে এমন জটিল মিথস্ক্রিয়াগুলি বোঝার চেষ্টা করতে ডায়াগ্রাম আঁকতে ঘন্টা ব্যয় করেছি।

আমি বুঝতে পারি যে রেডাক্সের লক্ষ্য এই রাষ্ট্রটির কিছুটা অনির্দেশ্যতার সমাধান করা। রাষ্ট্রকে আরও ভালভাবে পরিচালনা করতে সহায়তার জন্য এমন কি কিছু বা কোনও স্থাপত্য নিদর্শন রয়েছে যা ডাব্লুপিএফের সাথে পুরোপুরি ফিট করে? আমি নিশ্চিত না যে রেডাক্স নীতিগুলি NET- এ কতটা ভাল কাজ করবে আমি যেমন এখনও তাদের চেষ্টা করি নি। কারও কারও কিছু অভিজ্ঞতা আছে যা কিছু পরামর্শ দিতে পারে?


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

1
রিডেক্স ইন স্টেটটি আসলে আপডেট হয়, কখনও সংশোধিত হয় না।
অ্যান্ডি

1
আমি জানি আমি পার্টিতে দেরি করেছি তবে রেয়্যাক্ট.এনইটি নামে একটি প্রকল্প আছে যা রেডাক্স আর্কিটেকচারকে .NET এনে দেয়।
সাইবেরিয়ানগুই

যারা কৌণিক প্রকল্পগুলিতে এনজিআরএক্স / স্টোরের পছন্দ পছন্দ করেন তাদের জন্য নেটআরএক্স.স্টোর - এনজিআরএক্স / স্টোর দ্বারা অনুপ্রাণিত নেট প্রকল্পগুলির রাজ্য পরিচালনা রয়েছে। আপনি এটি নুগেটেও খুঁজে পেতে পারেন । এছাড়াও একটি ভাল ব্যবহারের নমুনা WPF প্রকল্পে MVVM প্যাটার্ন সঙ্গে NetRx.Store
Vitalii Ilchenko

উত্তর:


8

আমি মনে করি আপনি কি বলতে চাইছেন তা আমি জানি। মূলত আপনি একটি 'নিয়ামক' বা 'মাস্টার' ভিউমডেল (স্যুডোকোডকে ক্ষমা করুন) যোগ করে সমস্যার সমাধান করুন

অর্থাত

public class MasterVM
{
    public ChildVM View1 {get;set;}
    public ChildVM View2 {get;set;}

    private Data data;
    public MasterVM()
    {
        View1.OnEvent += updateData;
    }

    private Action<int> updateData(int value)
    {
         View2.Value = value;
    }
}

আপনি যখন মধ্যস্থতাকারী প্যাটার্নটির সাথে এটি করেন, আমি ক্লাসটিকে একটি নিয়ামক হিসাবে মনে করি। অর্থাত।

public class Controller
{
    public Controller(MediatorService m)
    {
        m.Subscribe("valueupdated", updateData);
    }

    private Action<int> updateData(int value)
    {
         m.Publish("showvalue", value);
    }
}

public class View2
{
    public View2(MediatorService m)
    {
        m.Subscribe("showvalue", (int v)=> {Value = v;});
    }
}

এই জাতীয় জিনিস আপনাকে আপনার 'ফ্লো লজিক' বা ইভেন্ট অর্কেস্টেশনকে এই উচ্চ স্তরের স্থিত শ্রেণিতে রাখতে এবং ভিএমএস কোড হালকা রাখতে দেয়। আপনি যদি 'পরিবর্তন করতে চান ব্যবহারকারী যখন কিনে ক্লিক করেন, আদেশটি প্রক্রিয়া করা হয়' আপনি জানেন এমন ধরণের জিনিসগুলি 'অর্ডারফ্লোকন্ট্রোলার' বা 'অর্ডারপ্রসেসভিএম' দেখতে বা তবে আপনি সেগুলির নাম রাখতে চান। BasketVM, PaymentVM, 3dSecureVM ইত্যাদির সংমিশ্রণের পরিবর্তে

সুতরাং আপনার নির্দিষ্ট উদাহরণে 'ট্যাব এখনও প্রস্তুত নয়' আপনার কাছে থাকতে পারে

public class Controller
{
    bool dataLoadCompleted;
    public Controller(MediatorService m)
    {
        m.Subscribe("setTabRequest", setTab); //message from view model with set tab button
        m.Subscribe("dataLoadComplete", dataLoadComplete); //message from data loading view model or some other controller?
    }

    private Action<int> setTab(int value)
    {
         if(!dataLoadCompleted)
         {
             m.Publish("error", "Please wait for data to load"); //message for error alert view model
         }
         else
         {
             m.Publish("setDefaultTab", value); //message for tab viewmodel
         }
    }

    private Action dataLoadComplete()
    {
         //persist state;
         dataLoadCompleted = true;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.