MVVM“binder”定义及其用法?

时间:2015-12-03 10:37:52

标签: javascript angularjs design-patterns model-view-controller mvvm

我一直在网上四处寻找,以便更好地了解MVVM

Wikipedia上,它指出MVVM模式的组件是:

  • 模型
  • 查看
  • 查看模型

这是我第一次遇到binder定义以及作为首字母缩略词一部分的modelviewview-model

MVVM维基百科定义 的“Binder”声明如下:

  

声明数据和命令绑定隐含在 MVVM 模式中。在Microsoft解决方案堆栈中,bindermarkup language,称为 XAML 。   绑定器使开发人员不必编写样板,以同步view modelview。   在Microsoft堆栈之外实现时,声明性databinding技术的存在是该模式的关键推动因素。

问题:每个MVVM模式始终是否包含binder?完全用于binder 的是什么? 它实际上是代码还是只有framework的自动化?

我几乎每天都在工作和使用AngularJS,有些人认为其模式为MVVM而不是MVC / MVP。我得到了View Model AngularJS调用"Controller"的内容,作为对“经典”MVC的回忆。 但AngularJS也使用了binder吗?在AngularJS编码时我仍然没有看到类似的东西,也许binder只是用在桌面编程框架而不是浏览器上?

在维基百科上,它WPF的{​​{1}}作为XAMl的{​​{1}}示例,那么C#的反例是什么? binder的{​​{1}}和/或他们的AngularJS也是AngularJS和/或templates

您是否可以提供维基百科文章的更好解释,可能有几个例子(syntax和/或view)?

编辑:我对binder进行了详细介绍,发现与these slides类似,介绍了术语AngularJS而不是WPF,所以:这是SO我们在讨论一个可选项,它是否出现在MVBMVVM中?

binder仅引用MVVMMVB之间的binder吗?您如何在图表上代表data-binding?它就像this one上的“数据绑定”一样吗?

谢谢。

2 个答案:

答案 0 :(得分:4)

A"绑定" something 描述视图模型中的数据将如何显示在视图中。 A"活页夹"是一些执行绑定所描述的操作的组件。绑定器对于MVVM框架很重要,因为它们允许您将View与ViewModel分离,并且使用权重来处理两者之间的状态同步。

活页夹执行以下操作

  • 解释(通常)UI
  • 中定义的绑定
  • 观察状态更改的视图模型并更新视图
  • 观察视图中的状态更改并更新视图模型

请注意,初始状态的引入也是状态的变化,更新的行为取决于绑定的解释。

据我所知,没有编程语言将绑定的概念融入语言中(即通过语言功能同步对象的两个实例的状态,如何观察者模式被烘焙到C#中作为events),因此在设计实现MVVM模式的系统时必须对绑定器进行编码。

维基百科对你的问题所描述的活页夹的定义非常糟糕。他们将标记语言与绑定行为混为一谈。 Xaml,WPF的标记语言,只是描述对象图的XML。它通过添加 markup extensions 来扩展xml, INotifyPropertyChanged properties 是通过特定格式的属性值定义的。

<!-- Attributes that are curly bracketed {} are markup extensions -->
<TextBox x:Name="My textbox lol" Text="{Binding Name}" />

xaml反序列化器将这些特殊属性识别为标记扩展,实际上是扩展MarkupExtension的类。 xaml反序列化器在反序列化过程中包含它们。上面示例中的Binding类是MarkupExtension的类型,是WPF中绑定程序的主要(但不是唯一!)实现。

WPF中的绑定系统非常复杂。它主要基于DependencyProperties,但可以与POCO进行良好的交互,并且以有限的方式与ko.applyBindings()属性进行交互。在反序列化期间,这些绑定将按标记中的描述进行实例化和配置,然后使用绑定子系统将视图和视图模型绑定在一起。

我比使用Angular更熟悉淘汰赛,但过程类似。您可以在UI中定义绑定,在构建DOM之后不久,框架会解释绑定。这是由框架本身确定的某种机制触发的。然后,框架解释这些绑定,以便将View Model中的可观察属性与UI绑定。

如果没有这种解释工作,你的绑定定义只会放在你的HTML中,什么都不做。有些东西必须解释它们并设置将处理状态同步的绑定。

在Knockout中,当您调用{{3}}并传入View模型时会发生这种情况。如果不调用它,所有data-bind绑定定义将在您的html中未使用。

这个过程如何在每个框架中发生,如何实现,以及每个框架调用绑定的内容都可能不同。

答案 1 :(得分:2)

维基百科不是一切都来自的地方。首先,阅读WPF和Silverlight架构师John Gossman撰写的这篇博客文章: Managed VMs are in beta
看到?没有任何&#34; Binder&#34;在那里。他写的是:

  

Model / View / ViewModel还依赖于另一件事:数据绑定的一般机制。

要理解MVVM真正读到的这篇文章的第一句话:

  

Model / View / ViewModel是模型/视图/控制器(MVC)的变体,专为现代UI开发平台量身定制,其中View是设计师而非经典开发人员的责任。

绑定机制不是模式本身的一部分。它是一种基础技术,对于应用这种模式至关重要。