它看起来像你矫枉过正。这不能通过框架来完成,并且这不能通过JavaScript来解决,因为语言没有访问控制。
MyService
既有getChore
和passChore
方法作为公共接口,任何单位使用该服务可以两种方法了。这很好。如果两个控制器都是由您自己开发的,并且您没有真正的理由来限制访问,请在此处应用Occam的剃须刀,不要再进一步观察。
如果这是一个由您开发并将由第三方使用的库,则不应从外部使用的方法可以标记为“内部”并进行相应命名。 AngularJS有一个约定,用$$
作为前缀。
在另一方面,打字稿旨在增强与类型和访问控制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()
,这将导致打字稿编译错误。
这种方法是过度工程的一个例子。即使指定了适当的界面,也没有人可以禁止开发者在某些时候用IDuplexFooService
类型替换IWritableFooService
。面向对象的最佳实践源于实际考虑,看起来没有。但是,是的,使用TypeScript可以做到这一点。
请提供您正在尝试做的实际代码。代码描述不起作用。目前还不清楚“隐藏”和“保护”是指什么。你从哪里“保护”这些数据?为什么? – estus
对不起,我已经添加了一个jsfiddle编辑的问题。我想知道是否有防止ModalCtrl访问数组的方法。 – Courtney
你的意思并不是真正的“保护”概念。 Javascript中没有私有变量。事情只能被上下文隐藏。如果你不想让你的控制器访问数组...只是不访问该控制器中的数组。 –