我一直在互联网上四处寻找,以便对MVVM
一般情况有更好的了解。
在Wikipedia上,它指出了MVVM
模式的组成部分:
模型
视图
查看模型
活页夹
这是我第一次遇到的binder
定义与一起model
,view
,view-model
这是缩写的一部分。
在维基百科的定义中的MVVM
的‘活页夹’规定如下:
声明性的数据和命令绑定在MVVM模式中是隐式的。在
Microsoft
溶液堆中,binder
是一个markup language
称为XAML。活页夹使开发人员免于编写模板逻辑来同步view model
和的义务view
。当在Microsoft
堆栈外部实现时,声明性databinding
技术的存在是该模式的关键推动因素。
问题:每个MVVM
模式都总是包含一个binder
吗?到底是做binder
什么用的?是您实际编写的东西,还是只是有些自动化framework
?
我AngularJS
几乎每天都在工作和使用,并且有些人同意它的模式MVVM
与MVC
/ 相反MVP
。我知道,View Model
这就是AngularJS
所谓"Controller"
的“经典” MVC
。但是也AngularJS
使用binder
吗?在进行编码时AngularJS
,我仍然没有看到类似的东西,也许binder
只是在桌面编程框架而不是在浏览器上使用?
在维基百科上它给出WPF
的XAMl
是一个C#
的例子binder
,所以这将是对反例AngularJS
?在AngularJS
的templates
和/或他们syntax
是view
和/或binder
过?
您能否通过几个示例(AngularJS
和/或WPF
)更好地解释维基百科的文章?
编辑:我看了更多SO
,发现这些幻灯片引入了一个类似的术语,MVB
而不是MVVM
,因此:这是binder
我们在谈论的一个可选内容,它同时出现在MVVM
和中MVB
吗?
是否binder
只是指data-binding
之间正在进行View
和View-Model
?您将如何binder
在图表上表示?难道就像“数据绑定”在这一个?
谢谢。
“结合”是什么,描述了如何在视图模型中的数据将在视图中显示。“绑定器”是执行绑定描述的动作的某些组件。绑定器对于MVVM框架很重要,因为它们使您可以将View与ViewModel分离,并且承担了在两者之间进行状态同步的沉重负担。
活页夹执行以下操作
解释(通常是)UI中定义的绑定
观察视图模型的状态变化并更新视图
观察视图的状态变化并更新视图模型
注意,引入初始状态也是状态的变化,并且更新操作取决于绑定的解释。
据我所知,没有编程语言将绑定的概念引入语言中(即,通过语言功能来同步对象的两个实例的状态,例如将Observer模式作为事件被引入C#中),因此,在设计实现MVVM模式的系统时必须对活页夹进行编码。
如您的问题所述,维基百科对活页夹的定义很糟糕。他们正在将标记语言与绑定行为相结合。WPF的标记语言Xaml只是描述对象图的XML。它通过添加标记扩展来扩展xml,标记扩展是通过特殊格式的属性值定义的。
xaml反序列化器将这些特殊属性识别为标记扩展,实际上是扩展类MarkupExtension
。xaml解串器将它们包含在反序列化过程中。上面示例中的Binding类是的类型MarkupExtension
,并且是WPF中绑定程序的主要(但不是唯一!)实现。
WPF中的绑定系统非常复杂。它主要基于DependencyProperties,但可以与INotifyPropertyChanged
属性很好地交互,并且可以与POCO属性以有限的方式进行交互。在反序列化期间,将按照标记中的说明实例化和配置这些绑定,然后与绑定子系统一起将View和View Model绑定在一起。
我对淘汰赛比对Angular更为熟悉,但是过程相似。您可以在UI中定义绑定,该绑定由框架在构建DOM之后不久的某个时间点进行解释。这是由框架本身确定的某种机制触发的。然后,框架将解释这些绑定,以便将视图模型内的可观察属性与UI绑定在一起。
没有这种解释工作,您的绑定定义就只能放在HTML中,而无所事事。有些东西必须解释它们并建立绑定,以处理状态同步。
在淘汰赛中,当您调用时ko.applyBindings()
,会在视图模型中传递时发生这种情况。无需调用它,所有data-bind
绑定定义都将在html中不使用。
该过程在每个框架中的发生方式,实现方式以及每个调用其绑定的方式都可以不同。