จะใส่ข้อมูลโมเดลและพฤติกรรมได้ที่ไหน [TL; ดร; ใช้บริการ]


341

ฉันกำลังทำงานกับ AngularJS สำหรับโครงการล่าสุดของฉัน ในเอกสารประกอบและแบบฝึกหัดข้อมูลโมเดลทั้งหมดจะถูกใส่เข้าไปในขอบเขตของคอนโทรลเลอร์ ฉันเข้าใจว่าจะต้องมีให้พร้อมใช้งานสำหรับคอนโทรลเลอร์และภายในมุมมองที่เกี่ยวข้อง

อย่างไรก็ตามฉันไม่คิดว่ารูปแบบควรนำไปใช้จริงที่นั่น มันอาจจะซับซ้อนและมีแอตทริบิวต์ส่วนตัวเช่น นอกจากนี้อาจต้องการนำมาใช้ซ้ำในบริบท / แอปอื่น การวางทุกอย่างลงในคอนโทรลเลอร์จะแบ่งรูปแบบ MVC โดยสิ้นเชิง

เช่นเดียวกันถือเป็นจริงสำหรับพฤติกรรมของรูปแบบใด ๆ ถ้าฉันจะใช้สถาปัตยกรรม DCIและแยกพฤติกรรมจากตัวแบบข้อมูลฉันจะต้องแนะนำวัตถุเพิ่มเติมเพื่อเก็บพฤติกรรม สิ่งนี้จะทำได้โดยการแนะนำบทบาทและบริบท

DCI == D ATA C ollaboration ฉัน nteraction

แน่นอนว่าแบบจำลองข้อมูลและพฤติกรรมสามารถนำไปใช้กับวัตถุจาวาสคริปต์ธรรมดาหรือรูปแบบ "คลาส" ใด ๆ แต่สิ่งที่จะเป็นวิธี AngularJS ที่จะทำอย่างไร ใช้บริการหรือไม่

ดังนั้นลงมาที่คำถามนี้:

คุณใช้โมเดลอย่างไรแยกจากคอนโทรลเลอร์ตามแนวทางปฏิบัติที่ดีที่สุดของ AngularJS


12
ฉันจะลงคะแนนคำถามนี้ถ้าคุณสามารถกำหนด DCI หรืออย่างน้อยก็ให้แบบฟอร์มการสะกดคำ ฉันไม่เคยเห็นคำย่อนี้มาจากวรรณกรรมซอฟต์แวร์ใด ๆ ขอบคุณ
Jim Raden

13
ฉันเพิ่งเพิ่มลิงค์สำหรับ DCI เป็นข้อมูลอ้างอิง
Nils Blum-Oeste

1
@JimRaden DCI เป็น Dataq, Context, interaction และเป็นกระบวนทัศน์ที่คิดค้นโดยบิดาแห่ง MVC (Trygve Reenskauge) เป็นครั้งแรก ตอนนี้มีเรื่องคร่าวๆอยู่บ้าง การอ่านที่ดีคือ Coplien และBjørnvig "Lean architecture"
Rune FS

3
ขอบคุณ ไม่ว่าจะดีขึ้นหรือแย่ลงคนส่วนใหญ่ยังไม่รู้เกี่ยวกับวรรณกรรมต้นฉบับในตอนนี้ Google มีบทความ 55 ล้านบทความเกี่ยวกับ MVC แต่มีเพียง 250,000 บทความที่กล่าวถึง MCI และ MVC และบน Microsoft.com 7. AngularJS.org ไม่ได้พูดถึงตัวย่อ DCI: "การค้นหาของคุณ - เว็บไซต์: angularjs.org dci - ไม่ตรงกับเอกสารใด ๆ "
Jim Raden

วัตถุทรัพยากรนั้นเป็นแบบจำลองใน Angular.js .. กำลังขยายออกไป
Salman von Abbas

คำตอบ:


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
สิ่งที่จะเป็นประโยชน์ในการใช้บริการมากกว่าเพียงแค่สร้างวัตถุ Javascript ธรรมดาเป็นแบบจำลองและกำหนดสิ่งนี้ให้กับขอบเขตควบคุม?
Nils Blum-Oeste

22
ในกรณีที่คุณต้องการตรรกะเดียวกันที่ใช้ร่วมกันระหว่างตัวควบคุมหลายตัว นอกจากนี้วิธีนี้ง่ายต่อการทดสอบสิ่งต่าง ๆ ด้วยตนเอง
Andrew Joslin

1
ตัวอย่างสุดท้ายของการดูดสิ่งนี้มีเหตุผลมากกว่า ฉันแก้ไขมัน
Andrew Joslin

9
ใช่ด้วยวัตถุ Javascript แบบธรรมดาคุณจะไม่สามารถฉีด Angular ใด ๆ ลงใน ListService ของคุณ เช่นเดียวกับในตัวอย่างนี้หากคุณต้องการ $ http.get เพื่อดึงข้อมูลรายการเมื่อเริ่มต้นหรือถ้าคุณต้องการฉีด $ rootScope เพื่อให้คุณสามารถ $ กระจายเหตุการณ์
Andrew Joslin

1
เพื่อให้ตัวอย่างนี้ DCI มากขึ้นเช่นข้อมูลไม่ควรอยู่นอก ListService?
PiTheNumber

81

ขณะนี้ฉันกำลังลองใช้รูปแบบนี้ซึ่งแม้ว่าจะไม่ใช่ DCI ให้บริการ decoupling แบบ / บริการแบบคลาสสิก (พร้อมบริการสำหรับการพูดคุยกับเว็บเซอร์วิส (หรือที่เรียกว่า CRUD รุ่น) และแบบจำลองที่กำหนดคุณสมบัติของวัตถุและวิธีการ)

โปรดทราบว่าฉันใช้รูปแบบนี้เมื่อใดก็ตามที่วัตถุจำลองต้องการวิธีการทำงานกับคุณสมบัติของตัวเองซึ่งฉันอาจจะใช้ทุกที่ (เช่น getter / setters ที่ได้รับการปรับปรุง) ฉันไม่ได้เรียกร้องให้ทำเช่นนี้สำหรับบริการทุกอย่างเป็นระบบ

แก้ไข: ฉันเคยคิดว่ารูปแบบนี้จะไปกับ "แบบจำลองเชิงมุมเป็นวัตถุจาวาสคริปต์ธรรมดา" มนต์ แต่ตอนนี้ฉันดูเหมือนว่ารูปแบบนี้จะดีอย่างสมบูรณ์

แก้ไข (2): เพื่อให้ชัดเจนยิ่งขึ้นฉันใช้ Model class เท่านั้นเพื่อแยกตัวรับสัญญาณ / setters ที่เรียบง่าย (เช่น: เพื่อใช้ในเทมเพลตมุมมอง) สำหรับตรรกะทางธุรกิจขนาดใหญ่ฉันขอแนะนำให้ใช้บริการแยกต่างหากที่ "รู้" เกี่ยวกับโมเดล แต่ถูกแยกออกจากพวกเขาและรวมเฉพาะตรรกะทางธุรกิจ เรียกว่าเป็นชั้นบริการ "ผู้เชี่ยวชาญด้านธุรกิจ" หากคุณต้องการ

service / ElementServices.js (สังเกตว่าการฉีดองค์ประกอบในการประกาศ)

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
}

model / Element.js (โดยใช้ angularjs Factory สร้างขึ้นสำหรับการสร้างวัตถุ)

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
ฉันเพิ่งเข้าสู่ Angular แต่ฉันอยากรู้ว่าทำไมทหารผ่านศึกถึงคิดว่านี่เป็นบาป นี่อาจเป็นวิธีแรกที่ฉันจะเข้าหามันเช่นกัน มีคนให้คำติชมบ้างไหม?
Aaronius

2
@Anarius เพื่อให้ชัดเจน: ฉันไม่เคยอ่านจริง ๆ "คุณไม่ควรทำอย่างนั้น" ในเอกสารหรือบล็อกใด ๆ ของ angularjs แต่ฉันเคยอ่านสิ่งต่าง ๆ เช่น "angularjs ไม่จำเป็นต้องมีรูปแบบก็แค่ใช้จาวาสคริปต์เก่าธรรมดา" และฉันต้องค้นพบรูปแบบนี้ด้วยตัวเอง เนื่องจากนี่เป็นโครงการจริงครั้งแรกของฉันใน AngularJS ฉันกำลังวางคำเตือนที่รัดกุมเหล่านั้นเพื่อให้ผู้คนไม่คัดลอก / วางโดยไม่ต้องคิดก่อน
เบ็นจี

ฉันได้ตัดสินในรูปแบบที่คล้าย ๆ กัน มันเป็นความอัปยศที่ Angular ไม่มีการสนับสนุนที่แท้จริง (หรือความปรารถนาที่จะสนับสนุน) แบบจำลองในความรู้สึก "คลาสสิค"
drt

3
นั่นไม่ได้ดูนอกรีตสำหรับฉันคุณกำลังใช้โรงงานสำหรับสิ่งที่พวกเขาสร้างขึ้นสำหรับ: การสร้างวัตถุ ฉันเชื่อว่า "angularjs ไม่จำเป็นต้องใช้แบบจำลอง" หมายถึงวลี "คุณไม่จำเป็นต้องสืบทอดจากคลาสพิเศษหรือใช้วิธีการพิเศษ (เช่น ko.observable, น็อคเอาต์) เพื่อทำงานกับโมเดลในเชิงมุม วัตถุบริสุทธิ์ js จะเพียงพอ "
เฟลิเป้คาสโตร

1
การไม่มี ElementService ที่มีชื่ออย่างเหมาะสมสำหรับแต่ละคอลเล็กชันจะส่งผลให้มีไฟล์ที่เหมือนกันเกือบทุกไฟล์
Collin Allen

29

เอกสาร Angularjs ระบุไว้อย่างชัดเจน:

ไม่เหมือนเฟรมเวิร์กอื่น ๆ อีกมากมายแองกูลาร์ไม่มีข้อ จำกัด หรือข้อกำหนดในแบบจำลอง ไม่มีคลาสที่สืบทอดจากหรือวิธีการเข้าถึงพิเศษสำหรับการเข้าถึงหรือเปลี่ยนรูปแบบ โมเดลสามารถเป็นแบบดั้งเดิมแฮชของวัตถุหรือชนิดของวัตถุทั้งหมด ในระยะสั้นรูปแบบเป็นวัตถุ JavaScript ธรรมดา

- คู่มือผู้พัฒนา AngularJS - แนวคิด V1.5 - รุ่น

ดังนั้นมันจึงขึ้นอยู่กับคุณว่าจะประกาศตัวแบบจำลองอย่างไร มันเป็นวัตถุ Javascript อย่างง่าย

โดยส่วนตัวฉันจะไม่ใช้บริการเชิงมุมเนื่องจากพวกเขาตั้งใจจะทำตัวเหมือนวัตถุเดี่ยวที่คุณสามารถใช้ยกตัวอย่างเช่นเพื่อรักษาสถานะโลกในแอปพลิเคชันของคุณ


คุณควรให้ลิงค์ไปยังที่ที่ระบุไว้ในเอกสารประกอบ ฉันทำการค้นหาโดย Google สำหรับ"Angular ไม่มีข้อ จำกัด หรือข้อกำหนดเกี่ยวกับแบบจำลอง"และมันก็ไม่ได้ปรากฏขึ้นที่ใดในเอกสารอย่างเป็นทางการเท่าที่ฉันสามารถบอกได้

4
มันเป็นใน angularjs เอกสารเก่า (หนึ่งในขณะที่ยังมีชีวิตอยู่ตอบ): github.com/gitsome/docular/blob/master/lib/angular/ngdocs/guide/...
SC

8

DCI เป็นกระบวนทัศน์และเป็นเช่นนี้ไม่มีวิธีการทำ JJ เชิงมุมทั้งภาษาสนับสนุน DCI หรือไม่ JS สนับสนุน DCI ค่อนข้างดีถ้าคุณยินดีที่จะใช้การแปลงแหล่งและด้วยข้อเสียถ้าคุณไม่ อีกครั้ง DCI ไม่มีอะไรเกี่ยวข้องกับการฉีดขึ้นอยู่กับว่าคลาส C # มีและไม่ได้ให้บริการอย่างแน่นอน ดังนั้นวิธีที่ดีที่สุดในการทำ DCI กับ angulusJS คือการทำ DCI ด้วยวิธี JS ซึ่งค่อนข้างใกล้เคียงกับวิธีการสร้าง DCI ตั้งแต่แรก ถ้าคุณไม่แปลงแหล่งข้อมูลคุณจะไม่สามารถทำได้อย่างเต็มที่เนื่องจากวิธีการบทบาทจะเป็นส่วนหนึ่งของวัตถุแม้จะอยู่นอกบริบท ถ้าคุณดูfullOO.infoไซต์ที่มีสิทธิ์สำหรับ DCI คุณสามารถดูการใช้งานทับทิมที่พวกเขาใช้วิธีการฉีดหรือคุณสามารถดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ DCI ส่วนใหญ่เป็นตัวอย่าง RUby แต่เนื้อหา DCI นั้นไม่เชื่อเรื่องนั้น หนึ่งในกุญแจสู่ DCI คือสิ่งที่ระบบทำแยกออกจากสิ่งที่เป็นระบบ ดังนั้นวัตถุข้อมูลจึงค่อนข้างโง่ แต่เมื่อถูกผูกไว้กับบทบาทในวิธีการตามบทบาทบริบทจะทำให้พฤติกรรมบางอย่างพร้อมใช้งาน บทบาทเป็นเพียงตัวระบุไม่มีอะไรเพิ่มเติมเมื่อเข้าถึงวัตถุผ่านตัวระบุนั้นแล้ววิธีการของบทบาทจะพร้อมใช้งาน ไม่มีวัตถุ / คลาสบทบาท ด้วยวิธีการฉีดการกำหนดขอบเขตของวิธีการบทบาทไม่ตรงตามที่อธิบาย แต่ปิด ตัวอย่างของบริบทใน JS อาจเป็นได้

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
ขอบคุณสำหรับการอธิบายเนื้อหาของ DCI มันเป็นการอ่านที่ยอดเยี่ยม แต่คำถามของฉันมีจุดมุ่งหมายที่ "จะวางโมเดลวัตถุในเชิงมุม" ได้อย่างไร DCI นั้นมีไว้เพื่ออ้างอิงเท่านั้นซึ่งฉันอาจไม่ได้มีแบบจำลองเท่านั้น แต่แยกเป็นแบบ DCI จะแก้ไขคำถามเพื่อให้ชัดเจนยิ่งขึ้น
Nils Blum-Oeste

7

บทความเกี่ยวกับแบบจำลองใน AngularJS นี้อาจช่วย:

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


7
โปรดทราบว่าคำตอบที่ลิงก์อย่างเดียวนั้นไม่ได้รับการสนับสนุนดังนั้นคำตอบควรเป็นจุดสิ้นสุดของการค้นหาโซลูชัน (เทียบกับการหยุดพักระหว่างการอ้างอิงอื่น โปรดลองเพิ่มบทสรุปแบบสแตนด์อโลนที่นี่โดยคงลิงก์ไว้เป็นข้อมูลอ้างอิง
kleopatra

การเพิ่มลิงก์ดังกล่าวในความคิดเห็นเกี่ยวกับคำถามน่าจะดีกว่า
jorrebor

ลิงค์นี้เป็นบทความที่ดีมาก แต่ก็ต้องมีการสร้างคำตอบให้เหมาะสำหรับ SO
Jeremy Zerr

5

ตามที่กล่าวไว้โดยผู้โพสต์คนอื่น ๆ Angular ไม่มีคลาสพื้นฐานสำหรับการสร้างแบบจำลองนอกกรอบ แต่มีประโยชน์หลายประการที่สามารถใช้งานได้:

  1. วิธีการในการโต้ตอบกับ RESTful API และสร้างวัตถุใหม่
  2. การสร้างความสัมพันธ์ระหว่างแบบจำลอง
  3. การตรวจสอบข้อมูลก่อนที่จะคงอยู่กับส่วนแบ็คเอนด์; มีประโยชน์สำหรับการแสดงข้อผิดพลาดแบบเรียลไทม์
  4. การแคชและการโหลดแบบสันหลังยาวเพื่อป้องกันการร้องขอ HTTP ที่สิ้นเปลือง
  5. สถานะเครื่องตะขอ (ก่อน / หลังการบันทึกอัปเดตสร้างใหม่ ฯลฯ )

หนึ่งไลบรารีที่ทำสิ่งเหล่านี้ได้ดีคือ ngActiveResource ( https://github.com/FacultyCreative/ngActiveResource ) การเปิดเผยแบบเต็ม - ฉันเขียนไลบรารีนี้ - และฉันใช้มันสำเร็จแล้วในการสร้างแอปพลิเคชันระดับองค์กรหลายแห่ง ผ่านการทดสอบอย่างดีและมอบ API ที่ผู้พัฒนา Rails คุ้นเคย

ทีมของฉันและฉันยังคงพัฒนาห้องสมุดนี้อย่างต่อเนื่องและฉันชอบที่จะเห็นนักพัฒนา Angular เพิ่มเติมให้การสนับสนุนและทดสอบการต่อสู้


เฮ้! มันยอดเยี่ยมจริงๆ! ฉันจะเสียบเข้ากับแอพของฉันทันที การทดสอบการต่อสู้เพิ่งเริ่ม
J. Bruni

1
ฉันเพียงแค่ดูโพสต์ของคุณและสงสัยว่าบริการของคุณngActiveResourceกับ Angular แตกต่างกัน$resourceอย่างไร ฉันยังใหม่กับ Angular เล็กน้อยและเรียกดูเอกสารทั้งสองชุดได้อย่างรวดเร็ว แต่พวกเขาดูเหมือนจะทับซ้อนกันมากมาย ได้ngActiveResourceรับการพัฒนาก่อนการ$resourceให้บริการที่มีอยู่หรือไม่
Eric B.

5

เป็นคำถามที่เก่ากว่า แต่ฉันคิดว่าหัวข้อนั้นมีความเกี่ยวข้องมากกว่าที่ได้รับทิศทางใหม่ของ Angular 2.0 ฉันจะบอกว่าวิธีปฏิบัติที่ดีที่สุดคือการเขียนโค้ดโดยมีการพึ่งพาเพียงเล็กน้อยในเฟรมเวิร์กเฉพาะที่เป็นไปได้ ใช้เฉพาะส่วนเฟรมเวิร์กที่เพิ่มมูลค่าโดยตรงเท่านั้น

ขณะนี้ดูเหมือนว่าบริการ Angular เป็นหนึ่งในแนวคิดไม่กี่อย่างที่จะทำให้เป็น Angular รุ่นต่อไปดังนั้นจึงเป็นเรื่องที่ฉลาดที่จะปฏิบัติตามแนวทางทั่วไปในการเคลื่อนย้ายตรรกะทั้งหมดไปยังบริการ อย่างไรก็ตามฉันขอยืนยันว่าคุณสามารถสร้างแบบจำลองแยกจากกันได้โดยไม่ต้องพึ่งพาบริการแองกูลาร์โดยตรง การสร้างวัตถุที่มีอยู่ในตัวเองที่มีการพึ่งพาและความรับผิดชอบที่จำเป็นเท่านั้นอาจเป็นวิธีที่จะไป นอกจากนี้ยังทำให้ชีวิตง่ายขึ้นมากเมื่อทำการทดสอบอัตโนมัติ ความรับผิดชอบเดี่ยวคือเรื่องปากต่อปากทำงานวันนี้ แต่มันทำให้รู้สึกมาก!

นี่คือตัวอย่างของ patter ที่ฉันคิดว่าดีสำหรับการแยกโมเดลวัตถุออกจาก dom

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

เป้าหมายสำคัญคือการจัดโครงสร้างโค้ดของคุณในแบบที่ทำให้ง่ายต่อการใช้งานจากการทดสอบหน่วยจากมุมมอง หากคุณบรรลุว่าคุณอยู่ในตำแหน่งที่ดีในการเขียนแบบทดสอบที่เป็นประโยชน์


4

ฉันพยายามที่จะแก้ไขปัญหาที่แน่นอนในโพสต์บล็อกนี้

โดยทั่วไปบ้านที่ดีที่สุดสำหรับการสร้างแบบจำลองข้อมูลอยู่ในบริการและโรงงาน อย่างไรก็ตามขึ้นอยู่กับวิธีที่คุณดึงข้อมูลและความซับซ้อนของพฤติกรรมที่คุณต้องการมีวิธีการมากมายในการปรับใช้ เชิงมุมในปัจจุบันไม่มีวิธีมาตรฐานหรือวิธีปฏิบัติที่ดีที่สุด

โพสต์ครอบคลุมสามวิธีใช้$ http , $ ทรัพยากรและRestangular

นี่คือตัวอย่างโค้ดสำหรับแต่ละgetResult()วิธีโดยใช้วิธีการที่กำหนดเองในรูปแบบงาน:

จำกัด (peasy ง่าย):

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;
    }]);

$ http (ไม่ยอมใครง่ายๆ):

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: $ http VS $ ทรัพยากร VS เป็นรูปสี่เหลี่ยมผืนผ้า

มีความเป็นไปได้ที่ Angular 2.0 จะเสนอโซลูชันที่มีประสิทธิภาพมากขึ้นสำหรับการสร้างแบบจำลองข้อมูลที่ทำให้ทุกคนในหน้าเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.