মডেল ডেটা এবং আচরণ কোথায় রাখবেন? [TL; ডাঃ; পরিষেবাগুলি]


341

আমি আমার সর্বশেষ প্রকল্পের জন্য অ্যাঙ্গুলারজেএসের সাথে কাজ করছি। ডকুমেন্টেশন এবং টিউটোরিয়ালে সমস্ত মডেল ডেটা নিয়ন্ত্রণকারীর সুযোগে রাখা হয়। আমি বুঝতে পারি যে কন্ট্রোলারের জন্য উপলব্ধ থাকতে হবে এবং এইভাবে সংশ্লিষ্ট মতামতের মধ্যে।

তবে আমি মনে করি না যে সেখানে মডেলটি বাস্তবে প্রয়োগ করা উচিত। এটি জটিল হতে পারে এবং উদাহরণস্বরূপ ব্যক্তিগত বৈশিষ্ট্য থাকতে পারে। তদ্ব্যতীত কেউ এটি অন্য প্রসঙ্গে / অ্যাপ্লিকেশনটিতে পুনরায় ব্যবহার করতে চাইতে পারে। নিয়ামকের মধ্যে সবকিছু রেখে পুরোপুরি এমভিসি প্যাটার্নটি ভেঙে যায়।

যে কোনও মডেলের আচরণের ক্ষেত্রে এটি একই সত্য। যদি আমি DCI আর্কিটেকচার এবং ডেটা মডেল থেকে পৃথক আচরণ ব্যবহার করি, তবে আচরণটি ধরে রাখতে আমাকে অতিরিক্ত অবজেক্টগুলি প্রবর্তন করতে হবে। ভূমিকা এবং প্রসঙ্গ প্রবর্তনের মাধ্যমে এটি করা হবে।

ডিসিআই == ডি আটা সি ওল্লায়ারেশন আমি নিকট করি

অবশ্যই মডেল ডেটা এবং আচরণ প্লেইন জাভাস্ক্রিপ্ট অবজেক্ট বা কোনও "শ্রেণি" প্যাটার্নের সাথে প্রয়োগ করা যেতে পারে। তবে এটি করার জন্য কৌনিক জেএস উপায় কী হবে? পরিষেবা ব্যবহার করছেন?

সুতরাং এটি এই প্রশ্নের নেমে আসে:

অ্যাংুলার জেএস সেরা অভ্যাস অনুসরণ করে আপনি কীভাবে নিয়ামক থেকে ডিউলড মডেলগুলি বাস্তবায়ন করবেন?


12
আপনি যদি ডিসিআইকে সংজ্ঞায়িত করতে পারেন বা কমপক্ষে বানানযুক্ত ফর্মটি সরবরাহ করতে পারেন তবে আমি এই প্রশ্নের উত্তর দিতে পারি। আমি কোনও সফ্টওয়্যার সাহিত্যে এই সংক্ষিপ্ত রূপটি কখনও দেখিনি। ধন্যবাদ।
জিম রাদেন

13
আমি কেবলমাত্র রেফারেন্স হিসাবে ডিসিআইয়ের জন্য একটি লিঙ্ক যুক্ত করেছি।
নিলস ব্লাম-ওস্টে

1
@ জিমর্যাডেন ডিসিআই হ'ল ডাটাক, প্রসঙ্গ, মিথস্ক্রিয়া এবং এমভিসি (ট্রাইগভে রেইনসকেজ) এর পিতা প্রথম তৈরি করেছিলেন এমন একটি দৃষ্টান্ত। এখনই এই বিষয়ে বেশ কিছু সাহিত্যিক। একটি ভাল পঠন হ'ল কোপলিয়ান এবং জর্জ্নভিগ "চর্বিহীন আর্কিটেকচার"
রুন এফএস

3
ধন্যবাদ। আরও ভাল বা খারাপের জন্য, বেশিরভাগ লোকেরা এখন পর্যন্ত মূল সাহিত্য সম্পর্কে জানেন না। গুগলের মতে এমভিসি সম্পর্কে ৫৫ মিলিয়ন নিবন্ধ রয়েছে, তবে এমসিআই এবং এমভিসি-র উল্লেখ রয়েছে কেবল 250,000। এবং মাইক্রোসফট.কম এ? 7. AngularJS.org এমনকি DCI সংক্ষিপ্ত বিবরণ উল্লেখ করে না: "আপনার অনুসন্ধান - সাইট: angularjs.org ডিসি - কোনও নথির সাথে মেলে না"।
জিম রাদেন

রিসোর্স অবজেক্টগুলি মূলত Angular.js এর মডেল .. সেগুলি প্রসারিত করছে।
সালমান ভন আব্বাস

উত্তর:


155

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

myApp.factory('ListService', function() {
  var ListService = {};
  var list = [];
  ListService.getItem = function(index) { return list[index]; }
  ListService.addItem = function(item) { list.push(item); }
  ListService.removeItem = function(item) { list.splice(list.indexOf(item), 1) }
  ListService.size = function() { return list.length; }

  return ListService;
});

function Ctrl1($scope, ListService) {
  //Can add/remove/get items from shared list
}

function Ctrl2($scope, ListService) {
  //Can add/remove/get items from shared list
}

23
কেবল একটি সরল জাভাস্ক্রিপ্ট অবজেক্টকে মডেল হিসাবে তৈরি করা এবং এটি নিয়ন্ত্রণকারীর সুযোগের জন্য নির্ধারিত করার চেয়ে কোনও পরিষেবা ব্যবহার করে কী সুবিধা হবে?
নিলস ব্লাম-ওস্টে

22
যদি আপনার একাধিক কন্ট্রোলারের মধ্যে ভাগ করে নেওয়া একই যুক্তির প্রয়োজন হয়। এছাড়াও, এইভাবে জিনিসগুলি স্বাধীনভাবে পরীক্ষা করা আরও সহজ।
অ্যান্ড্রু জোসলিন

1
সর্বশেষ উদাহরণ ধরণের sucked, এই এক আরও জ্ঞান করে। আমি এটি সম্পাদনা করেছি।
অ্যান্ড্রু জোসলিন

9
হ্যাঁ, একটি সরল পুরাতন জাভাস্ক্রিপ্ট অবজেক্টের সাহায্যে আপনি নিজের তালিকা পরিষেবাতে কৌণিক কিছু ইনজেক্ট করতে সক্ষম হবেন না। এই উদাহরণের মতো, শুরুতে তালিকার ডেটা পুনরুদ্ধার করার জন্য আপনার যদি $ http.get প্রয়োজন হয়, বা আপনার যদি $ রুটস্কোপ ইনজেক্ট করার দরকার হয় যাতে আপনি ইভেন্টগুলি সম্প্রচার করতে পারেন।
অ্যান্ড্রু জোসলিন

1
এই উদাহরণটি আরও বেশি করে DCI পছন্দ করার জন্য ডেটা তালিকাগুলির বাইরে থাকা উচিত নয়?
পাইপ নাম্বার

81

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

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

সম্পাদনা: আমি ভাবতাম যে এই প্যাটার্নটি "অ্যাঙ্গুলার মডেল প্লেইন পুরাতন জাভাস্ক্রিপ্ট অবজেক্ট" মন্ত্রের বিপরীতে যাবে তবে এখন আমার কাছে মনে হয় এই প্যাটার্নটি পুরোপুরি ঠিক আছে।

সম্পাদনা (2): আরও পরিষ্কার হতে, আমি একটি সাধারণ ক্লাস ব্যবহার করি কেবল সাধারণ গেটার / সেটারগুলিকে ফ্যাক্টর করার জন্য (যেমন: ভিউ টেমপ্লেটগুলিতে ব্যবহার করা যেতে পারে)। বড় ব্যবসায়ের যুক্তির জন্য, আমি পৃথক পরিষেবা (গুলি) ব্যবহার করার পরামর্শ দিচ্ছি যা মডেল সম্পর্কে "জানে" তবে তাদের থেকে পৃথক রাখা হয় এবং কেবল ব্যবসায় যুক্তি অন্তর্ভুক্ত করে। আপনি যদি চান তবে এটিকে "ব্যবসায় বিশেষজ্ঞ" পরিষেবা স্তর বলুন

পরিষেবা / এলিমেন্ট সার্ভিস.জেএস (ঘোষণায় কীভাবে এলিমেন্টটি ইনজেকশন দেওয়া হয় তা লক্ষ্য করুন)

MyApp.service('ElementServices', function($http, $q, Element)
{
    this.getById = function(id)
    {
        return $http.get('/element/' + id).then(
            function(response)
            {
                //this is where the Element model is used
                return new Element(response.data);
            },
            function(response)
            {
                return $q.reject(response.data.error);
            }
        );
    };
    ... other CRUD methods
}

মডেল / এলিমেন্ট.জেএস (অ্যাজুলার ফ্যাক্টরি ব্যবহার করে, অবজেক্ট তৈরির জন্য তৈরি)

MyApp.factory('Element', function()
{
    var Element = function(data) {
        //set defaults properties and functions
        angular.extend(this, {
            id:null,
            collection1:[],
            collection2:[],
            status:'NEW',
            //... other properties

            //dummy isNew function that would work on two properties to harden code
            isNew:function(){
                return (this.status=='NEW' || this.id == null);
            }
        });
        angular.extend(this, data);
    };
    return Element;
});

4
আমি কেবল কৌণিকের সাথে gettingুকছি, তবে আমি জানতে আগ্রহী হয়েছি / কেন অভিজ্ঞরা / কেন এটি ভণ্ডামি ভাবেন। এটি সম্ভবত প্রাথমিকভাবে এটির কাছেও যেতে হবে। কেউ কিছু প্রতিক্রিয়া জানাতে পারে?
অ্যারনিয়াস

2
@ অ্যারনিয়াসটি স্পষ্ট করে বলতে: আমি আসলে কোনও কৌণিক ডক বা ব্লগে "আপনার কখনই এটি করা উচিত নয়" পড়েনি, তবে আমি সবসময় "অ্যাঙ্গুলার্সের কোনও মডেলের প্রয়োজন হয় না, এটি কেবল সরল পুরাতন জাভাস্ক্রিপ্ট ব্যবহার করা হয়" এর মতো জিনিসগুলি পড়েছি " , এবং আমাকে নিজেরাই এই প্যাটার্নটি আবিষ্কার করতে হয়েছিল। যেহেতু এটি AngularJS এ আমার প্রথম আসল প্রকল্প, তাই আমি এই দৃ those় সতর্কতাগুলি রাখছি, যাতে লোকেরা প্রথমে চিন্তা না করে অনুলিপি / পেস্ট না করে।
বেন জি

আমি প্রায় একই ধাঁচে স্থির হয়েছি। এটি লজ্জাজনক যে অ্যাঙ্গুলারটির "শাস্ত্রীয়" অর্থে কোনও মডেলের আসল সমর্থন (বা আপাতদৃষ্টিতে সমর্থন করার ইচ্ছা নেই) নেই।
এপ্রিলটি ড্রট করুন

3
এটি আমার কাছে ধর্মবিরোধী বলে মনে হচ্ছে না, আপনি কারখানাগুলি তাদের জন্য তৈরি হয়েছিল: বিল্ডিং অবজেক্টের জন্য ব্যবহার করছেন। আমি বিশ্বাস করি "কৌণিক মডেলগুলির প্রয়োজন হয় না" বাক্যাংশটির অর্থ "কৌণিকের মডেলগুলির সাথে কাজ করার জন্য আপনাকে একটি বিশেষ শ্রেণীর উত্তরাধিকারী হতে হবে না বা বিশেষ পদ্ধতি (যেমন কো.ওবসারেবল, নকআউটে) ব্যবহার করতে হবে না" খাঁটি জেএস বস্তু যথেষ্ট হবে "।
ফিলিপ কাস্ত্রো

1
প্রতিটি সংগ্রহের জন্য উপযুক্ত নামযুক্ত এলিমেন্ট সার্ভিস না থাকলে প্রায় এক-অভিন্ন ফাইলের গুচ্ছ হয়?
কলিন অ্যালেন

29

অ্যাঙ্গুলারজ ডকুমেন্টেশন পরিষ্কারভাবে বলে:

অন্যান্য অনেক ফ্রেমওয়ার্কের মতো নয়, কৌণিক মডেলটিতে কোনও বিধিনিষেধ বা প্রয়োজনীয়তা তোলে না। মডেলটি অ্যাক্সেস বা পরিবর্তন করার জন্য উত্তরাধিকার সূত্রে কোনও ক্লাস বা বিশেষ অ্যাকসেসর পদ্ধতি নেই। মডেলটি আদিম, অবজেক্ট হ্যাশ বা সম্পূর্ণ বস্তুর প্রকার হতে পারে। সংক্ষেপে মডেলটি একটি সরল জাভাস্ক্রিপ্ট অবজেক্ট।

- AngularJS বিকাশকারী গাইড - V1.5 ধারণা - মডেল

সুতরাং এর অর্থ এটি কীভাবে একটি মডেল ঘোষণা করবেন তা আপনার উপর নির্ভর করে। এটি একটি সরল জাভাস্ক্রিপ্ট অবজেক্ট।

আমি ব্যক্তিগতভাবে কৌণিক পরিষেবাগুলি ব্যবহার করব না কারণ এগুলি বোঝানো হয়েছিল যে আপনি ব্যবহার করতে পারেন এমন সিঙ্গলটন অবজেক্টের মতো আচরণ করা, উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশন জুড়ে বৈশ্বিক রাজ্যগুলি রাখা।


ডকুমেন্টেশনে এটি যেখানে বর্ণিত হয়েছে তার একটি লিঙ্ক সরবরাহ করা উচিত। আমি "অ্যাঙ্গুলার মডেলটিতে কোনও বিধিনিষেধ বা প্রয়োজনীয়তা তৈরি করে না" এর জন্য একটি গুগল অনুসন্ধান করেছি এবং এটি যতদূর আমি বলতে পারি সরকারী ডক্সে কোথাও পরিণত হয় না।

4
এটি পুরানো অ্যাঙ্গুলারজ ডক্সে ছিল (উত্তর দেওয়ার সময় তিনি জীবিত): github.com/gitsome/docular/blob/master/lib/angular/ngdocs/guide/…
এসসি

8

ডিসিআই একটি দৃষ্টান্ত এবং এটির মতো কোনও কৌণিক জেএস উপায় নেই, ভাষা DCC সমর্থন করে বা এটি তা করে না। আপনি উত্স রূপান্তর ব্যবহার করতে ইচ্ছুক এবং আপনি যদি না হন তবে কিছু ঘাটতি থাকলে জেএস ডিসিআইকে বরং ভাল সমর্থন করে। আবার ডি সি আই-র নির্ভরতা ইনজেকশন নিয়ে আর কিছু করার নেই, বরং বলা হয় যে একটি সি # ক্লাস রয়েছে এবং এটি অবশ্যই কোনও পরিষেবা নয়। সুতরাং এনজুলাসজেএস দিয়ে ডিসিআই করার সর্বোত্তম উপায় হ'ল ডিসিআই জেএস পদ্ধতিটি করা, যা ডিসিআইকে প্রথম স্থানে কীভাবে তৈরি করা হয় তার খুব কাছাকাছি। আপনি যদি সোর্স ট্রান্সফরমেশন না করেন তবে আপনি এটি পুরোপুরি করতে সক্ষম হবেন না কারণ ভূমিকা পদ্ধতিগুলি প্রসঙ্গের বাইরেও অবজেক্টের অংশ হয়ে উঠবে তবে এটি সাধারণত পদ্ধতি ইনজেকশন ভিত্তিক ডিসিআইয়ের সমস্যা। আপনি যদি তাকান ফুলইউ.ইন.ইন.ফো.কে দেখেনডিসিআইয়ের অনুমোদনের সাইটটিতে আপনি রুবি বাস্তবায়নের উপর নজর রাখতে পারেন তারাও পদ্ধতি ইনজেকশন ব্যবহার করে বা ডিসিআই সম্পর্কিত আরও তথ্যের জন্য আপনি এখানে একবার দেখতে পারেন । এটি বেশিরভাগ আরবিবি উদাহরণ সহ তবে ডিসিআই স্টাফগুলি এটি অজ্ঞেয়। ডিসিআই-এর একটি চাবি হ'ল সিস্টেম যা করে তা সিস্টেমটি কী থেকে আলাদা হয়। সুতরাং ডেটা অবজেক্টটি বেশ বোবা তবে একবার প্রসঙ্গের ভূমিকা পদ্ধতির কোনও ভূমিকাতে আবদ্ধ হওয়া নির্দিষ্ট আচরণকে উপলভ্য করে। একটি ভূমিকা কেবল একটি সনাক্তকারী হয়, আর কিছুই নয়, সেই শনাক্তকারীর মাধ্যমে কোনও বস্তুর অ্যাক্সেস করার পরে ভূমিকা পদ্ধতিগুলি উপলব্ধ। কোনও ভূমিকা বস্তু / শ্রেণি নেই। পদ্ধতির ইনজেকশনের সাহায্যে ভূমিকা পদ্ধতির স্কোপিং বর্ণিত ঠিক মতো নয় তবে ঘনিষ্ঠ। জেএসে একটি প্রসঙ্গে উদাহরণ হতে পারে

function transfer(source,destination){
   source.transfer = function(amount){
        source.withdraw(amount);
        source.log("withdrew " + amount);
        destination.receive(amount);
   };
   destination.receive = function(amount){
      destination.deposit(amount);
      destination.log("deposited " + amount);
   };
   this.transfer = function(amount){
    source.transfer(amount);
   };
}

1
ডিসিআই স্টাফগুলি বিস্তৃত করার জন্য ধন্যবাদ এটি একটি মহান পঠিত। তবে আমার প্রশ্নগুলির মূল উদ্দেশ্য "মডেল অবজেক্টগুলিকে কৌণিকুলিতে কোথায় রাখবেন" at ডিসিআই কেবল রেফারেন্সের জন্য রয়েছে, আমার কাছে কেবলমাত্র একটি মডেল থাকতে পারে না, তবে এটি ডিসিআই উপায়ে বিভক্ত করতে হবে। প্রশ্নটি আরও স্পষ্ট করতে সম্পাদনা করবে Will
নিলস ব্লাম-ওস্টে

7

AngularJS এর ​​মডেলগুলি সম্পর্কে এই নিবন্ধটি সহায়তা করতে পারে:

http://joelhooks.com/blog/2013/04/24/modeling-data-and-state-in-your-angularjs-application/


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

প্রশ্নের মন্তব্যে এ জাতীয় লিঙ্ক যুক্ত করা ঠিক হবে।
জোর্বারবার

এই লিঙ্কটি আসলে খুব ভাল নিবন্ধ, তবে এটির পক্ষে উপযুক্ত হওয়ার জন্য এটি উত্তরের জন্য তৈরি করা দরকার
জেরেমি জের

5

অন্যান্য পোস্টার দ্বারা যেমনটি বলা হয়েছে, কৌণিক মডেলিংয়ের জন্য কোনও বক্স বেস-ক্লাস সরবরাহ করে না, তবে কেউ কার্যকরভাবে কয়েকটি কার্য সরবরাহ করতে পারে:

  1. একটি RESTful API এর সাথে আলাপচারিতা এবং নতুন অবজেক্ট তৈরি করার পদ্ধতি
  2. মডেলদের মধ্যে সম্পর্ক স্থাপন
  3. ব্যাকএন্ড অব্যাহত রাখার আগে ডেটা বৈধকরণ; রিয়েল-টাইম ত্রুটিগুলি প্রদর্শনের জন্যও কার্যকর
  4. অপ্রয়োজনীয় HTTP অনুরোধগুলি করা থেকে বিরত রাখতে ক্যাচিং এবং অলস-লোডিং
  5. রাজ্য মেশিন হুক (সংরক্ষণের পূর্বে / পরে আপডেট, তৈরি, নতুন ইত্যাদি)

একটি লাইব্রেরি যা এই সমস্তগুলি ভাল করে দেয় তা হ'ল এনজিএটিটিভ রিসোর্স ( https://github.com/FactoryCreative/ngActiveResource )। সম্পূর্ণ প্রকাশ - আমি এই গ্রন্থাগারটি লিখেছি - এবং আমি এটি বেশ কয়েকটি এন্টারপ্রাইজ-স্কেল অ্যাপ্লিকেশন তৈরিতে সফলভাবে ব্যবহার করেছি। এটি ভালভাবে পরীক্ষা করা হয়েছে এবং এটি এমন একটি এপিআই সরবরাহ করে যা রেল বিকাশকারীদের কাছে পরিচিত।

আমার দল এবং আমি সক্রিয়ভাবে এই লাইব্রেরিটি বিকাশ করে চলেছি এবং আমি আরও কৌণিক বিকাশকারীরা এতে অবদান রাখতে এবং এটির যুদ্ধ পরীক্ষা দেখতে দেখতে পছন্দ করব।


হে! এটি সত্যিই দুর্দান্ত! আমি এখনই আমার অ্যাপ এ এটি প্লাগ করব। যুদ্ধ পরীক্ষা সবে শুরু হয়েছে।
জে ব্রুনি

1
আমি কেবল আপনার পোস্টটির দিকে তাকিয়ে ছিলাম এবং ভাবছিলাম যে আপনার ngActiveResourceএবং কৌনিকের $resourceপরিষেবার মধ্যে কী পার্থক্য রয়েছে । আমি কৌণিক সামান্য নতুন, এবং দ্রুত উভয় ডক্সের ব্রাউজ করেছি, তবে তারা প্রচুর ওভারল্যাপ সরবরাহ করে বলে মনে হচ্ছে। ছিল ngActiveResourceপূর্বে উন্নত $resourceসেবা পাওয়া যায় না? '
এরিক বি

5

একটি পুরানো প্রশ্ন, তবে আমি মনে করি বিষয়টি অ্যাংুলার ২.০ এর নতুন দিকের চেয়ে আরও প্রাসঙ্গিক। আমি বলব একটি সর্বোত্তম অনুশীলন হ'ল সম্ভব নির্দিষ্ট কাঠামোর উপর কম নির্ভরতা সহ কোড রচনা করা। কেবল কাঠামোর নির্দিষ্ট অংশগুলি ব্যবহার করুন যেখানে এটি সরাসরি মান যুক্ত করে।

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

এটি কোনও প্যাটারের উদাহরণ যা আমি ডোম থেকে অবজেক্ট মডেলটিকে ডিক্লুপ করার জন্য ভাল বিবেচনা করি।

http://www.syntaxsuccess.com/viewarticle/548ebac8ecdac75c8a09d58e

একটি মূল লক্ষ্য হ'ল আপনার কোডটি এমনভাবে গঠন করা যা কোনও দৃশ্যের চেয়ে ইউনিট পরীক্ষাগুলি থেকে ব্যবহার করা ঠিক তত সহজ করে তোলে। আপনি যদি অর্জন করেন যে আপনি বাস্তববাদী এবং দরকারী পরীক্ষা লিখতে ভাল অবস্থানে আছেন।


4

আমি এই ব্লগ পোস্টে সেই সঠিক সমস্যাটি সমাধান করার চেষ্টা করেছি

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

পোস্টটি $ http , $ রিসোর্স এবং রেস্টাঙ্গুলার ব্যবহার করে তিনটি পন্থাকে covers েকে রাখে

এখানে getResult()কাজের মডেলটিতে একটি কাস্টম পদ্ধতি সহ প্রত্যেকটির জন্য কয়েকটি উদাহরণ কোড দেওয়া হয়েছে :

পুনরায় সংশ্লেষ (সহজ প্যাসি):

angular.module('job.models', [])
  .service('Job', ['Restangular', function(Restangular) {
    var Job = Restangular.service('jobs');

    Restangular.extendModel('jobs', function(model) {
      model.getResult = function() {
        if (this.status == 'complete') {
          if (this.passed === null) return "Finished";
          else if (this.passed === true) return "Pass";
          else if (this.passed === false) return "Fail";
        }
        else return "Running";
      };

      return model;
    });

    return Job;
  }]);

$ সংস্থান (সামান্য আরও বিশৃঙ্খল):

angular.module('job.models', [])
    .factory('Job', ['$resource', function($resource) {
        var Job = $resource('/api/jobs/:jobId', { full: 'true', jobId: '@id' }, {
            query: {
                method: 'GET',
                isArray: false,
                transformResponse: function(data, header) {
                    var wrapped = angular.fromJson(data);
                    angular.forEach(wrapped.items, function(item, idx) {
                        wrapped.items[idx] = new Job(item);
                    });
                    return wrapped;
                }
            }
        });

        Job.prototype.getResult = function() {
            if (this.status == 'complete') {
                if (this.passed === null) return "Finished";
                else if (this.passed === true) return "Pass";
                else if (this.passed === false) return "Fail";
            }
            else return "Running";
        };

        return Job;
    }]);

$ HT (হার্ড):

angular.module('job.models', [])
    .service('JobManager', ['$http', 'Job', function($http, Job) {
        return {
            getAll: function(limit) {
                var params = {"limit": limit, "full": 'true'};
                return $http.get('/api/jobs', {params: params})
                  .then(function(response) {
                    var data = response.data;
                    var jobs = [];
                    for (var i = 0; i < data.objects.length; i ++) {
                        jobs.push(new Job(data.objects[i]));
                    }
                    return jobs;
                });
            }
        };
    }])
    .factory('Job', function() {
        function Job(data) {
            for (attr in data) {
                if (data.hasOwnProperty(attr))
                    this[attr] = data[attr];
            }
        }

        Job.prototype.getResult = function() {
            if (this.status == 'complete') {
                if (this.passed === null) return "Finished";
                else if (this.passed === true) return "Pass";
                else if (this.passed === false) return "Fail";
            }
            else return "Running";
        };

        return Job;
    });

ব্লগ পোস্ট নিজেই আপনি প্রতিটি পন্থা কেন ব্যবহার করতে পারেন তার পিছনে যুক্তি এবং সেইসাথে আপনার নিয়ন্ত্রকদের মডেলগুলি কীভাবে ব্যবহার করবেন তার কোড উদাহরণগুলিতে আরও বিশদে যায়:

AngularJS ডেটা মডেল: $ HT VS $ রিসোর্স ভিএস রেষ্টাঙ্গুলার

অ্যাঙ্গুলার ২.০ ডেটা মডেলিংয়ের আরও দৃ solution় সমাধান প্রস্তাব করবে যা একই পৃষ্ঠায় প্রত্যেককে পেয়ে যায় a

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