我刚刚发现了如何使用存储数组的服务在控制器之间共享数据,并通过引用将其传递给第二个控制器。
是否有一种方法可以保护阵列免受第一个控制器的影响,因为该控制器只需要将项目传递给服务。该阵列仅由第二个控制器使用。
ModalController
- 接受来自用户的输入MyService
- 从用户那里获取输入并将其存储在数组中 - ActionController
- 引用MyService数组并将其显示在视图以上是该应用的基本结构。
Here是它的一个小问题
答案 0 :(得分:0)
看起来你过度了。这不能通过框架来完成,这不能通过JavaScript解决,因为该语言没有访问控制。
MyService
同时使用getChore
和passChore
方法作为公共接口,任何使用该服务的单元都可以使用这两种方法。这很好。如果两个控制器都是由您自己开发的,并且您没有真正的理由限制访问,请在此处应用Occam的剃须刀,不要再看了。
如果这是一个由您开发并将由第三方使用的库,则不应从外部使用的方法可以标记为“内部”并相应地命名。 AngularJS的约定是为所有内部事物添加前缀$$
。
另一方面,TypeScript旨在通过类型和访问控制来扩充JavaScript,因此可以这样解决,至少在设计时(在TS源代码编译为JS之前):
interface IWritableFooService {
setFoo();
}
interface IDuplexFooService extends IWritableFooService {
getFoo();
}
class FooService implements IDuplexFooService {
getFoo() {...}
setFoo() {...}
}
考虑到该服务被定义为
app.service('fooService', FooService);
可以在限制型的一个地方注射:
app.controller('BarController', function (fooService: IWritableFooService) {...});
另一种是松散型:
app.controller('BazController', function (fooService: IDuplexFooService) {...});
如果BarController
尝试使用fooService.getFoo()
,则会导致TypeScript编译错误。
这种方法是过度工程的一个例子。即使指定了适当的界面,也没有人可以禁止开发人员在某些时候用IWritableFooService
类型替换IDuplexFooService
。 OOP最佳实践源于实际考虑,似乎没有。但是,可以使用TypeScript执行此操作。