0

我刚刚发现如何使用存储数组的服务在控制器之间共享数据,并通过引用将其传递给第二个控制器。如何从一个控制器隐藏数据,但使用共享服务与另一个控制器共享

有没有一种方法可以保护阵列免受第一个控制器的影响,因为该控制器只需要将一个项目传递给服务。该阵列仅由第二个控制器使用。

  • ModalController - 接受来自用户
  • MyService输入 -
  • ActionController - - 从所述用户并将其存储在一个阵列获取输入具有与为MyService数组的引用,并将其显示在视图

以上是应用程序的基本结构。

Here是它的一个的jsfiddle

+0

请提供您正在尝试做的实际代码。代码描述不起作用。目前还不清楚“隐藏”和“保护”是指什么。你从哪里“保护”这些数据?为什么? – estus

+0

对不起,我已经添加了一个jsfiddle编辑的问题。我想知道是否有防止ModalCtrl访问数组的方法。 – Courtney

+0

你的意思并不是真正的“保护”概念。 Javascript中没有私有变量。事情只能被上下文隐藏。如果你不想让你的控制器访问数组...只是不访问该控制器中的数组。 –

回答

0

它看起来像你矫枉过正。这不能通过框架来完成,并且这不能通过JavaScript来解决,因为语言没有访问控制。

MyService既有getChorepassChore方法作为公共接口,任何单位使用该服务可以两种方法了。这很好。如果两个控制器都是由您自己开发的,并且您没有真正的理由来限制访问,请在此处应用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可以做到这一点。

相关问题