Câu hỏi Sự khác biệt giữa MVC và MVVM là gì?


Có sự khác biệt nào giữa mẫu "Model View Controller" chuẩn và mẫu Model / View / ViewModel của Microsoft không?


1099
2018-03-20 20:09


gốc


Tôi tiếp tục chạy vào câu hỏi này vì vậy tôi đã viết một bài báo giải thích sự khác biệt giữa MVC, MVVM và MVP. Một sự khác biệt mà mọi người bỏ lỡ là trong MVC, bộ điều khiển chọn chế độ xem (ví dụ: máy chủ web). Sau khi khung nhìn được chọn, trạng thái của khung nhìn không được kết nối với bộ điều khiển. MVVM, trạng thái của khung nhìn được liên tục kết nối với ViewModel (có một số tính năng tương tự như bộ điều khiển). Hãy suy nghĩ WPF / datacontext. Có thực sự nhiều hơn để nó hơn thế. MVC vs MVP vs MVVM: Sự khác biệt được giải thích - students.cs.byu.edu/~cs340ta/spring2017/notes/08-MVC/… - i8abug
Lưu ý rằng trong khi MVVM được Microsoft đặt ra, nhiều nhà phát triển và dự án không phải của Microsoft đã bắt đầu áp dụng mẫu này. Nhận xét này đã được đưa đến cho bạn bởi bộ phận người ghét-MS-ghét. - BoltClock♦
Đã làm việc với MVVM trong một thời gian dài, bàn chải đầu tiên của tôi với MVC là bực bội, cho đến khi tôi biết tôi có thể vượt qua ViewModels qua lại cho trình duyệt bằng cách sử dụng các kỹ thuật ràng buộc được tìm thấy trong MVVM. Nhưng như Joel đã nói ở trên, cách duy nhất để lấy lại trạng thái từ trình duyệt là bằng cách đăng các thay đổi trong một biểu mẫu (sử dụng tên / giá trị). Nếu bạn không hiểu rõ điểm này. Bạn sẽ gặp khó khăn trong MVC. Chỉ cần nhìn vào bộ điều khiển như một bộ phun phụ thuộc cho khung nhìn và bạn đã sẵn sàng. - John Peters
Một câu hỏi được bỏ phiếu như vậy trên [mẫu thiết kế] cao cấp. Tôi rất vui lòng đề nghị sử dụng sơ đồ trên các câu trả lời. - Ricardo
Đây là một phiên bản lưu trữ của bài viết của Joel: web.archive.org/web/20150219153055/http://joel.inpointform.net/… - Tereza Tomcova


Các câu trả lời:


MVC / MVVM không phải là hoặc là lựa chọn.

Hai mẫu được tạo thành theo nhiều cách khác nhau, trong cả hai phát triển ASP.Net và Silverlight / WPF.

Đối với ASP.Net, MVVM được sử dụng để liên kết hai chiều dữ liệu trong chế độ xem. Điều này thường là triển khai phía máy khách (ví dụ: sử dụng Knockout.js). Mặt khác, MVC là cách tách mối quan tâm ở phía máy chủ.

Đối với Silverlight và WPF, mô hình MVVM bao quát hơn và có thể xuất hiện để thay thế cho MVC (hoặc các mẫu phần mềm tổ chức khác thành trách nhiệm riêng). Một giả thiết, thường xuất hiện từ mô hình này, là ViewModel chỉ cần thay thế bộ điều khiển trong MVC (như thể bạn có thể thay thế VM cho C trong từ viết tắt và tất cả sẽ được tha thứ) ...

ViewModel không phải nhất thiết phải thay thế nhu cầu cho Bộ điều khiển riêng biệt.

Vấn đề là: để có thể kiểm tra độc lập *, và đặc biệt là có thể tái sử dụng khi cần thiết, một mô hình xem không có ý tưởng xem cái gì đang hiển thị nó, nhưng quan trọng hơn không biết dữ liệu của nó đến từ đâu.

* Lưu ý: trong thực tế Bộ điều khiển loại bỏ hầu hết logic, từ ViewModel, yêu cầu kiểm tra đơn vị. VM sau đó trở thành một container ngu ngốc đòi hỏi ít, nếu có, thử nghiệm. Đây là một điều tốt vì VM chỉ là một cây cầu, giữa nhà thiết kế và người lập trình, vì vậy nên được giữ đơn giản.

Ngay cả trong MVVM, bộ điều khiển thường sẽ chứa tất cả logic xử lý và quyết định dữ liệu nào sẽ hiển thị trong chế độ xem sử dụng kiểu xem nào.

Từ những gì chúng tôi đã thấy cho đến nay, lợi ích chính của mô hình ViewModel là xóa mã khỏi mã XAML-behind để làm cho XAML chỉnh sửa một tác vụ độc lập hơn. Chúng tôi vẫn tạo ra bộ điều khiển, khi và khi cần thiết, để kiểm soát (không có ý định chơi chữ) logic tổng thể của các ứng dụng của chúng tôi.

Các hướng dẫn MVCVM cơ bản mà chúng tôi theo dõi là:

  • Lượt xem hiển thị một hình dạng nhất định của dữ liệu. Họ không biết dữ liệu đến từ đâu.
  • Chế độ xem giữ một hình dạng nhất định của dữ liệu và lệnh, họ không biết nơi dữ liệu, hoặc mã, đến từ hoặc làm thế nào nó được hiển thị.
  • Mô hình giữ dữ liệu thực tế (bối cảnh khác nhau, cửa hàng hoặc các phương pháp khác)
  • Bộ điều khiển lắng nghe và xuất bản, các sự kiện. Bộ điều khiển cung cấp logic kiểm soát dữ liệu nào được nhìn thấy và ở đâu. Bộ điều khiển cung cấp mã lệnh cho ViewModel để ViewModel thực sự có thể tái sử dụng được.

Chúng tôi cũng lưu ý rằng Khung mã gen điêu khắc thực hiện MVVM và một mẫu tương tự như Prism VÀ nó cũng sử dụng rộng rãi các bộ điều khiển để tách riêng tất cả các trường hợp sử dụng logic.

Đừng cho rằng các bộ điều khiển bị lỗi thời bởi các kiểu xem.

Tôi đã bắt đầu một blog về chủ đề này mà tôi sẽ thêm vào và khi tôi có thể. Có nhiều vấn đề với việc kết hợp MVCVM với các hệ thống định vị chung, vì hầu hết các hệ thống định vị chỉ sử dụng Views và VM, nhưng tôi sẽ đi sâu vào đó trong các bài sau.

Một lợi ích nữa của việc sử dụng mô hình MVCVM là chỉ các đối tượng bộ điều khiển cần tồn tại trong bộ nhớ cho tuổi thọ của ứng dụng và các bộ điều khiển chứa chủ yếu là mã và dữ liệu trạng thái nhỏ (tức là bộ nhớ cực nhỏ). Điều này làm cho các ứng dụng ít tốn nhiều bộ nhớ hơn các giải pháp mà các mô hình xem phải được giữ lại và lý tưởng cho một số loại phát triển di động nhất định (ví dụ: Windows Mobile sử dụng Silverlight / Prism / MEF). Điều này tất nhiên phụ thuộc vào loại ứng dụng vì bạn vẫn có thể cần phải giữ lại các máy ảo được lưu trữ thường xuyên để đáp ứng.

Lưu ý: Bài đăng này đã được chỉnh sửa nhiều lần và không nhắm mục tiêu cụ thể đến câu hỏi hẹp, vì vậy tôi đã cập nhật phần đầu tiên để đề cập đến điều đó. Phần lớn các cuộc thảo luận, trong các bình luận dưới đây, chỉ liên quan đến ASP.Net chứ không chỉ là hình ảnh rộng hơn. Bài viết này được dự định để trang trải việc sử dụng rộng rãi hơn MVVM trong Silverlight, WPF và ASP.Net và cố gắng tránh những người thay thế các bộ điều khiển bằng ViewModels.


579
2017-08-22 09:19



Không phải là nó MVC được sử dụng để kiến ​​trúc sư toàn bộ (web) ứng dụng, trong khi MVVM được sử dụng bên trong Xem thành phần của MVC? Vì vậy, toàn bộ mô hình sẽ là M (VVM) C - Tomasz Zielinski
@ Tomasz Zielinski: Đúng, nhưng "nơi chúng được sử dụng" không phải là câu hỏi (hoặc là câu trả lời của tôi). Quan điểm của tôi là các bộ điều khiển vẫn hữu ích trong MVVM. - Gone Coding
Tôi đồng ý. Nhận xét của tôi là do sự khai sáng đột ngột và không phải vì tôi không đồng ý với bạn. - Tomasz Zielinski
@ Justin: Tôi thấy từ ngữ của tôi về câu đó là một chút mơ hồ. Tôi thực sự có nghĩa là thử nghiệm đơn vị cho tất cả các thành phần được hỗ trợ dễ dàng hơn, chứ không chỉ là cải thiện kiểm tra của ViewModels (mà bạn chỉ ra không thực sự làm điều đó nhiều trong MVCVM ... đó là những gì bạn muốn). Lợi ích thực sự của bộ điều khiển là bạn đang thực sự loại bỏ hầu hết các yêu cầu để kiểm tra từ ViewModel (nơi mọi người giữ logic điều khiển đẩy) và đặt nó vào nơi nó có thể được kiểm tra (chủ yếu là Bộ điều khiển và Mô hình). Nhận xét tái sử dụng cụ thể cho các máy ảo trong câu đó. Tôi đã chỉnh sửa nó. - Gone Coding
@TomaszZielinski M (MVVM) C - Mohamed Emad


Tôi nghĩ cách dễ nhất để hiểu những từ viết tắt này có ý nghĩa gì là quên chúng một chút. Thay vào đó, hãy nghĩ về phần mềm mà họ bắt nguồn, mỗi người trong số họ. Nó thực sự chỉ là sự khác biệt giữa web đầu và desktop.

Từ viết tắt đầu tiên, MVC, có nguồn gốc trên web. (Có, nó có thể đã có trước đó, nhưng trang web là cách nó đã phổ biến đến khối lượng của các nhà phát triển web.) Hãy suy nghĩ cơ sở dữ liệu, các trang HTML, và mã inbetween. Hãy tinh chỉnh điều này một chút để đến MVC: Đối với cơ sở dữ liệu «, hãy giả sử cơ sở dữ liệu cộng với mã giao diện. Đối với »Các trang HTML«, hãy giả sử các mẫu HTML cộng với mã xử lý mẫu. Đối với »mã inbetween«, chúng ta hãy giả sử mã lập bản đồ người dùng nhấp chuột để hành động, có thể ảnh hưởng đến cơ sở dữ liệu, chắc chắn gây ra một lần xem được hiển thị. Đó là nó, ít nhất là với mục đích so sánh này.

Hãy giữ lại một tính năng của công cụ web này, không phải như ngày nay, nhưng khi nó tồn tại mười năm trước, khi Javascript là một ít phiền toái, đáng khinh bỉ, những lập trình viên thực sự làm tốt để tránh xa: Trang HTML cơ bản là câm và thụ động . Trình duyệt là một ứng dụng khách mỏng, hoặc nếu bạn muốn, một khách hàng nghèo. Không có thông minh trong trình duyệt. Quy tắc tải lại trang đầy đủ. Các «view» được tạo ra một lần nữa mỗi lần xung quanh.

Hãy nhớ rằng cách web này, mặc dù là tất cả các cơn giận dữ, là khủng khiếp lạc hậu so với máy tính để bàn. Ứng dụng dành cho máy tính để bàn là khách hàng chất béo hoặc khách hàng giàu có, nếu bạn muốn. (Ngay cả một chương trình như Microsoft Word có thể được coi như là loại khách hàng, một khách hàng cho các tài liệu.) Họ là khách hàng đầy trí thông minh, đầy đủ kiến ​​thức về dữ liệu của họ. Họ là nhà nước. Chúng lưu trữ dữ liệu mà chúng đang xử lý trong bộ nhớ. Không có crap như một trang đầy đủ tải lại.

Và cách làm việc trên máy tính để bàn phong phú này có lẽ là nơi bắt nguồn từ viết tắt thứ hai, MVVM. Đừng bị lừa bởi các chữ cái, bởi sự thiếu sót của C. Bộ điều khiển vẫn còn đó. Họ cần phải như vậy. Không có gì bị xóa. Chúng ta chỉ cần thêm một điều: statefulness, data cached trên máy khách (và cùng với nó thông minh để xử lý dữ liệu đó). Dữ liệu đó, về cơ bản là một bộ nhớ cache trên máy khách, bây giờ được gọi là »ViewModel«. Đó là điều cho phép tương tác phong phú. Và đó là nó.

  • MVC = mô hình, bộ điều khiển, view = về cơ bản giao tiếp một chiều = tương tác kém
  • MVVM = mô hình, bộ điều khiển, bộ nhớ cache, xem = truyền thông hai chiều = tương tác phong phú

Chúng ta có thể thấy rằng với Flash, Silverlight và - quan trọng nhất - Javascript, web đã chấp nhận MVVM. Trình duyệt có thể không còn được gọi là khách hàng mỏng hợp pháp nữa. Nhìn vào khả năng lập trình của họ. Nhìn vào mức tiêu thụ bộ nhớ của họ. Xem xét tất cả tương tác Javascript trên các trang web hiện đại.

Cá nhân, tôi tìm thấy lý thuyết này và kinh doanh viết tắt dễ hiểu hơn bằng cách nhìn vào những gì nó đề cập đến trong thực tế cụ thể. Các khái niệm trừu tượng rất hữu ích, đặc biệt khi được thể hiện trên vật chất cụ thể, vì vậy sự hiểu biết có thể đến vòng tròn đầy đủ.


212
2018-02-13 14:11



MVC không có nguồn gốc trên web. Trygve Reenskaug đã giới thiệu MVC vào Smalltalk-76 trong thập niên 1970. - Arialdo Martini
Ngay cả khi nó đã được thay đổi thành "MVC đã được phổ biến thông qua thiết kế ứng dụng web." Tôi cho rằng đây là suy đoán mà không có trích dẫn thích hợp. - Dan Bechard
Arialdo: Cảm ơn, tôi không biết về Smalltalk-76. (Chơi với đồ chơi khác sau đó :) Cười đùa sang một bên, nó thú vị bao nhiêu tuổi của một số khái niệm này. - @Dan, những gì tôi viết là: "[MVC] có thể đã có trước đó [web], nhưng web là cách nó được phổ biến rộng rãi với khối lượng của các nhà phát triển web." Tôi vẫn nghĩ đó là chính xác. Tôi không có một trích dẫn cho nó, nhưng sau đó tôi không cảm thấy tôi cần một vì MVC phổ biến đại chúng là một phần của kinh nghiệm cá nhân của tôi khi tôi bắt đầu như là một nhà phát triển web vào đầu thập kỷ qua. Apache Struts đã trở nên thịnh hành, với rất nhiều đậu cho MVC. - Lumi
MVC không phải là "giao tiếp một chiều về cơ bản" vì các phiên bản của trình duyệt đều phát sinh các Bài đăng và Bài đăng mọi lúc. Cả Gets và Posts đều có thể thay đổi các giá trị trường được tìm thấy trong chuỗi truy vấn. Điều này mang lại cho trình duyệt nhiều cơ hội để gửi thông tin về bộ điều khiển. MVC được xây dựng trên đầu trang của HTTP 1.0 mà luôn luôn có hai cách giao tiếp trong tâm trí. - John Peters
Cảm ơn Lumi. Điều này có ý nghĩa với tôi nhiều hơn các câu trả lời khác. Nó có đúng không? Tôi không có ý kiến. Nhưng theo quan điểm của tôi thì nó ít nhất là mạch lạc. - gcdev


MVVM  Chế độ xem mô hình View -Mô hình tương tự như MVC, Bộ điều khiển xem mô hình

Bộ điều khiển được thay thế bằng một ViewModel. ViewModel nằm bên dưới lớp UI. ViewModel hiển thị dữ liệu và các đối tượng lệnh mà khung nhìn cần. Bạn có thể nghĩ về điều này như một đối tượng chứa mà khung nhìn đi lấy dữ liệu và hành động của nó. ViewModel lấy dữ liệu của nó từ mô hình.

Russel East một blog thảo luận chi tiết hơn Tại sao MVVM lại khác với MVC


166
2018-03-20 20:18



Câu "Bộ điều khiển được thay thế bằng Mô hình Xem" là không chính xác. Trong MVVM vai trò của bộ điều khiển là databinding (hoặc ràng buộc bởi quy ước nếu bạn sử dụng điều đó). - DaniCE
MVVM sẽ chỉ có ý nghĩa khi sử dụng dữ liệu hai chiều của WPF. Nếu không MVC / MVP vv sẽ là đủ. - Jeff
@ DaniCE: Josh Smith: If you put ten software architects into a room and have them discuss what the Model-View-Controller pattern is, you will end up with twelve different opinions. … - sll
@OmShankar Thứ 11 không phải từ bản thân bạn. Có tổng cộng 10 người và tổng cộng 12 ý kiến. Câu ngạn ngữ có nghĩa là ngụ ý rằng các định nghĩa của các mẫu này mở ra để giải thích rằng ít nhất hai người sẽ bị lẫn lộn đủ để có nhiều hơn một ý kiến. - Dan Bechard
@ DaniCE Vâng đây thực sự là điểm của ràng buộc dữ liệu của WPF, và Microsoft đã phát minh MVVM, trong đó người ta có thể bỏ qua hoàn toàn bộ điều khiển, (tuyên bố câu "Bộ điều khiển đang được thay thế bằng Mô hình Xem" không chính xác chỉ vì có một bộ điều khiển đằng sau hậu trường, về cơ bản giống như tuyên bố một tuyên bố "Ngôn ngữ cấp cao thay thế việc sử dụng mã máy khó hiểu với những người dễ đọc hơn" là không chính xác vì ngôn ngữ máy đằng sau hậu trường vẫn đang được sử dụng ...) - yoel halb


Đối với một điều, MVVM là một sự tiến triển của mô hình MVC sử dụng XAML để xử lý màn hình. bài viết này vạch ra một số khía cạnh của cả hai.

Lực đẩy chính của kiến ​​trúc Model / View / ViewModel có vẻ là trên đỉnh của dữ liệu ("Model"), có một lớp khác của các thành phần không nhìn thấy ("ViewModel") ánh xạ các khái niệm của dữ liệu chặt chẽ hơn với các khái niệm về chế độ xem dữ liệu ("Chế độ xem"). Đó là ViewModel mà Chế độ xem liên kết với, không phải Mô hình trực tiếp.


85
2018-03-20 20:17



Tôi nghĩ rằng đoạn bạn trích dẫn tổng nó lên IMHO độc đáo. Một khía cạnh của ViewModel là nó là một phiên bản được làm phẳng / thay đổi của mô hình cho khung nhìn. Nhiều mẫu MV * khác liên kết với thực mô hình. - Daniel Auger
"Nhiều mẫu MV khác lại liên kết lại với mô hình thực tế"? Thật sao? Tôi nghĩ khung cảnh luôn được gắn với bộ điều khiển trong MVC, cho dù thế nào đi chăng nữa. - PlagueHammer
Nocturne: Trong MVC cổ điển, View không có nhiều việc phải làm với bộ điều khiển, nó liên kết chủ yếu với Model. Hãy suy nghĩ về nó như một robot - Mô hình đại diện cho vị trí của khớp robot, Xem là một màn hình LCD mà bạn nhìn thấy robot, Bộ điều khiển là ví dụ. bàn phím. Trong thiết lập như vậy, Chế độ xem phụ thuộc vào Mô hình, tức là vị trí không gian của rô bốt, mà bạn có thể thấy trên màn hình là biểu diễn trực tiếp của Mô hình. - Tomasz Zielinski
@Nocturne Những gì daniel xuất hiện để nói rằng trong khi chính thức tất cả MV * nên sử dụng một máy ảo riêng biệt, nhiều nhà phát triển chỉ bỏ qua nó, và vượt qua mô hình thực tế, và trong thực tế không có gì trong các chi tiết kỹ thuật ví dụ của MVC không cho phép nó, tuy nhiên trong MVVM phải một VM chịu trách nhiệm về sự chuyển tiếp giữa mô hình và khung nhìn - yoel halb
Tôi sẽ nói nó như thế này: Mô hình là điều tủ quần áo để DB schema. Khi một truy vấn được chạy, nó có thể chiếu dữ liệu vào các kiểu mạnh ở lớp mô hình. Chế độ xem là tập hợp các thứ, bao gồm các đối tượng mô hình, nhưng có thể và giữ trạng thái xem đối với dữ liệu. Bộ điều khiển chỉ đơn giản là cảnh sát giao thông giữa chế độ xem và chế độ xem và tất nhiên chế độ xem chỉ liên quan đến trạng thái chế độ xem. - John Peters


Bạn có thể xem giải thích của mẫu MVVM trong môi trường Windows:

Trong mẫu thiết kế Model-View-ViewModel, một ứng dụng bao gồm ba thành phần chung. enter image description here

  • Mô hình: Điều này thể hiện mô hình dữ liệu mà ứng dụng của bạn tiêu thụ. Ví dụ, trong một ứng dụng chia sẻ hình ảnh, lớp này có thể đại diện cho tập hợp các hình ảnh có sẵn trên một thiết bị và API được sử dụng để đọc và ghi vào thư viện hình ảnh.

  • Lượt xem: Một ứng dụng thường bao gồm nhiều trang giao diện người dùng. Mỗi trang được hiển thị cho người dùng là chế độ xem trong thuật ngữ MVVM. Chế độ xem là mã XAML được sử dụng để xác định và tạo kiểu cho những gì người dùng nhìn thấy. Dữ liệu từ mô hình được hiển thị cho người dùng và đó là công việc của ViewModel để cung cấp dữ liệu cho giao diện người dùng này dựa trên trạng thái hiện tại của ứng dụng. Ví dụ, trong một ứng dụng chia sẻ hình ảnh, các khung nhìn sẽ là giao diện người dùng hiển thị cho người dùng danh sách các album trên thiết bị, các hình ảnh trong một album, và có lẽ một cái khác hiển thị cho người dùng một bức ảnh cụ thể.

  • ViewModel: ViewModel liên kết mô hình dữ liệu hoặc đơn giản là mô hình, với giao diện người dùng hoặc chế độ xem của ứng dụng. Nó chứa logic để quản lý dữ liệu từ mô hình và hiển thị dữ liệu dưới dạng tập hợp các thuộc tính mà giao diện người dùng XAML hoặc chế độ xem có thể liên kết. Ví dụ, trong một ứng dụng chia sẻ hình ảnh, ViewModel sẽ hiển thị một danh sách các album và mỗi album sẽ hiển thị một danh sách các ảnh. Giao diện người dùng là bất khả tri về hình ảnh đến từ đâu và cách chúng được truy xuất. Nó chỉ đơn giản là biết về một tập hợp các hình ảnh như được hiển thị bởi ViewModel và hiển thị chúng cho người dùng.


44
2018-06-12 20:48



Lưu ý rằng mặc dù bài viết được tham chiếu áp dụng cho việc phát triển với Microsoft Stack - Cụ thể là Windows Phone - và XAML, nó không phải là. - Richard Nalezynski


Tôi nghĩ một trong những điểm khác biệt chính là trong MVC, V của bạn đọc M của bạn trực tiếp, và đi qua C để thao tác dữ liệu, trong khi MVVM, VM của bạn hoạt động như một proxy M, cũng như cung cấp chức năng sẵn có cho bạn V.

Nếu tôi không đầy rác, tôi ngạc nhiên không ai đã tạo ra một lai, nơi VM của bạn chỉ là một proxy M, và C cung cấp tất cả các chức năng.


35
2018-05-21 11:38



+1. Thuật ngữ là đúng tôi nghĩ. nhưng về việc tạo ra M-MProxy-V-C lai không phải là quá nhiều sự tách biệt? tôi nghĩ rằng nó sẽ là đủ bằng cách sử dụng M-V-C trong khi M là một mô hình với sự hỗ trợ đầy đủ của ràng buộc. ;) - ktutnik
+1. Như tôi đã nhận xét ở trên, tôi nghĩ rằng MVC được sử dụng để kiến ​​trúc sư toàn bộ (web) ứng dụng, trong khi MVVM được sử dụng bên trong Xem thành phần của MVC. - Tomasz Zielinski
@ktutnik: Mô hình thường nằm trên máy chủ, trong khi ViewModel sống trên máy khách. Vì vậy, không có khả năng cho HTML liên kết trực tiếp với Mô hình phía máy chủ. Do đó, chúng tôi cần ModelView hoạt động như một bộ dữ liệu làm việc cục bộ chưa được lưu trữ từ mô hình bằng cách sử dụng ví dụ: AJAX / JSON. - Tomasz Zielinski
Chế độ xem thực sự "đọc" dữ liệu mô hình vì nó đã được bộ điều khiển đưa vào đó. Tôi muốn tham khảo nó như là một "dữ liệu tiêm" bởi bộ điều khiển vì nó thực sự là bộ điều khiển đó là phụ trách. Tất cả chế độ xem đều hiển thị trong các sự kiện hiển thị và kích hoạt trong đầu tôi. - John Peters
Tôi xin lỗi nhưng không đồng ý với cách diễn giải MVVM. ViewModel không có ý tưởng về Chế độ xem hoặc Giao diện sẽ trông như thế nào hoặc cách nó sẽ phản hồi và một Mô hình tương tự như vậy không có ý tưởng về một ViewModel. Trong thực tế, một View thậm chí không nên biết về một mô hình, hoặc chỉ là một ViewModel. Mô hình phải đại diện cho dữ liệu và trạng thái ứng dụng, ViewModel nên dịch trạng thái sang dữ liệu có khả năng UI (Tôi khuyên tất cả các nguyên thủy vào thời điểm này) và một khung nhìn nên phản ứng với bản dịch ViewModels. Dữ liệu thường sẽ giống nhau nhưng nó vẫn phải được bao bọc và phân phối lại thông qua ViewModel và không có bộ điều khiển nào tồn tại. - Michael Puckett II


Sự khác biệt đơn giản: (Lấy cảm hứng từ khóa học Coursera AngularJS của Yaakov)

enter image description here

MVC (Bộ điều khiển xem mô hình)

  1. Mô hình: Mô hình chứa thông tin dữ liệu. Không gọi hoặc sử dụng Bộ điều khiển và Chế độ xem. Chứa logic nghiệp vụ và cách để thể hiện dữ liệu. Một số dữ liệu này, ở một số dạng, có thể được hiển thị trong dạng xem. Nó cũng có thể chứa logic để lấy dữ liệu từ một số nguồn.
  2. Bộ điều khiển: Hành vi là kết nối giữa chế độ xem và mô hình. Xem các cuộc gọi Controller và Controller gọi mô hình. Về cơ bản nó thông báo cho mô hình và / hoặc quan điểm để thay đổi khi thích hợp.
  3. Lượt xem: Giao dịch với phần giao diện người dùng. Tương tác với người dùng.

MVVM (Model View View Model)

ViewModel:

  1. Nó là đại diện cho trạng thái của khung nhìn.
  2. Nó chứa dữ liệu được hiển thị trong chế độ xem.
  3. Trả lời để xem các sự kiện, còn gọi là logic trình bày.
  4. Gọi các chức năng khác để xử lý logic nghiệp vụ.
  5. Không bao giờ trực tiếp yêu cầu xem để hiển thị bất cứ điều gì.

17
2017-12-14 00:20





MVVM là một sự tinh tế (có thể tranh luận) của Mô hình trình bày mẫu. Tôi nói gây tranh cãi, bởi vì sự khác biệt duy nhất là làm thế nào WPF cung cấp khả năng làm ràng buộc dữ liệu và xử lý lệnh.


16
2018-03-27 21:22



Trong năm 2009 câu trả lời này có lẽ là một câu trả lời hay nhưng hôm nay, không có tranh luận nào ngay cả khi điều khiển HTML Helper từ MSFT cho phép ràng buộc bằng cách sử dụng những người trợ giúp "For" khét tiếng. Knockout là tất cả về ràng buộc dữ liệu ở phía máy khách. - John Peters
Tôi đã nói điều này, trong năm 2009, bởi vì quá nhiều người trong cộng đồng chấp nhận câu trả lời này. Tôi đã nói điều đó là gây tranh cãi, bởi vì MVVM và mô hình trình bày thực sự là cùng một khuôn mẫu với các tên gọi khác nhau. Tăng mức độ phổ biến trong WPF, nó thường được gọi là MVVM trong các khung công tác khác ngày hôm nay, nhưng tên là chính xác. - wekempf