将Silverlight MVVM应用移植到AngularJS

本文关键字:AngularJS 应用 Silverlight MVVM | 更新日期: 2023-09-27 18:11:50

我们正在将一个现有的Silverlight应用移植到AngularJS/Typescript中。

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

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

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

将Silverlight MVVM应用移植到AngularJS

首先,我想说的是,您不应该试图将一种技术与另一种技术相匹配。用c#做一个应用不是用Javascript(或任何风格的Javascript)做一个应用,所以试图给silverlight的东西在Angular/Javascript上如何调用命名并不是一个好主意。

我建议你(和你的团队)学习Angular应用程序是如何构建的,哪些组件用于什么目的,然后将IDEA移植到Angular中。把Angular应用程序编码成silverlight应用程序可不是个好主意。

无论如何,为了回答问题,我将回答你的一些问题,因为我熟悉WPF/Silverlight。

在angular中,没有必要实现任何观察模式(有pubsub)。

通常你有一些服务做一些事情,比如一个存储库模式来访问你的后端或保存你的数据在不同的页面中使用。因为服务是单例的,如果你从pageA修改它,pageB会知道,所以没有必要告诉,这是隐式的。

$scope作为连接控制器和视图的粘合剂。因为$scope保存pojo(普通的旧javascript对象),你可以在里面放任何你需要的东西。你可以有嵌套的对象或函数。然后你就可以在视图的$作用域上使用这些属性了,没有任何问题。

如果一个Service查询一个后端,它会更新服务的数据,并且每个使用该服务的控制器都会自动获得更新的内容。这里的技巧在于,您不必终止引用,只需更新值即可。

所以,花一点时间来学习Angular,不要把Silverlight放在脑子里,学习每个部分的功能,然后开始工作。这是我的建议。