C# 将Silverlight MVVM应用程序移植到AngularJS

C# 将Silverlight MVVM应用程序移植到AngularJS,c#,angularjs,silverlight,mvvm,C#,Angularjs,Silverlight,Mvvm,我们正在将现有的Silverlight应用程序移植到AngularJS/Typescript中 该应用程序具有经典的MVVM结构,其中包含数据模型、视图模型和视图。这些模型在某种程度上是紧密联系在一起的:例如,有IObservable事件流通知容器模型子模型中的更改 让我困惑的是:在MVVM中,绑定到视图的所有内容都是视图模型。一个视图模型可能具有其包含的其他视图模型的列表。然而,在所有面向WPF/Silverlight背景的AngularJS教程中,只有$scope称为视图模型。嵌套对象呢?它

我们正在将现有的Silverlight应用程序移植到AngularJS/Typescript中

该应用程序具有经典的MVVM结构,其中包含数据模型、视图模型和视图。这些模型在某种程度上是紧密联系在一起的:例如,有
IObservable
事件流通知容器模型子模型中的更改

让我困惑的是:在MVVM中,绑定到视图的所有内容都是视图模型。一个视图模型可能具有其包含的其他视图模型的列表。然而,在所有面向WPF/Silverlight背景的AngularJS教程中,只有
$scope
称为视图模型。嵌套对象呢?它们是否只是域数据模型,而您直接绑定到它们,而不需要任何中间视图模型层


然后,还有另一个问题:如果我的数据对象以某种方式发生了更改(例如,某些服务在从网络接收数据时对其进行了更新,或者它只是根据计时器进行了一些工作),我如何通知视图应该对其进行更新?

首先,我想说的是,您不应该尝试将一种技术与另一种技术相匹配。在C#中开发应用程序并不意味着在Javascript(或它的任何风格)中开发应用程序,因此尝试在Angular/Javascript上命名silverlight东西是如何调用的不是一个好主意

我建议您(和您的团队)了解Angular应用程序是如何制作的,哪些组件用于什么目的,然后将想法移植到Angular。像silverlight应用程序那样编写一个有角度的应用程序不是一个好主意

无论如何,为了得到答案,我将回答您的一些问题,因为我熟悉WPF/Silverlight

在angular中,实际上不需要实现任何观察模式(有pubsub)

通常情况下,您的服务可以做一些事情,比如访问后端的存储库模式或保存数据以在不同页面中使用。由于服务是单例的,如果您从pageA修改它,pageB就会知道,所以无需说明,这是隐式的

$scope充当控制器和视图之间的粘合剂。由于$scope包含POJO(普通的旧javascript对象),因此您可以将任何需要的内容放入其中。您可以在其中嵌套对象或函数。然后您可以在视图中使用$scope上的这些属性,而不会出现任何问题

如果服务查询后端,它会更新服务的数据,使用该服务的每个控制器都会自动获取更新的内容。这里要知道的技巧是,您不必删除引用,只需更新值


因此,请花一点时间学习Angular,而不要将Silverlight放在心上,学习每一个片段的功能并开始工作。这是我的建议。

使用双向数据绑定,在大多数情况下,如果
$scope.thing
更改
{thing},则无需通知任何内容
将立即在DOM中呈现更改。@Pak,如果那里有一个复选框网格,如
$scope.rows[0]。items[1].isEnabled
并在超时时设置为
false
?AngularJS怎么知道?看一下
$watch
谢谢你的详细回答。我同意最好的方法是使用Angular提供的本地方法,而不是试图在其中模仿Silverlight。的确,尝试将你的知识映射到有棱角的东西,你不会被它带走:)