如何从一个控制器隐藏数据,但使用共享服务与另一个控制器共享

时间:2017-04-24 20:59:27

标签: javascript angularjs model-view-controller angular-services angular-controller

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

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

  • ModalController - 接受来自用户的输入
  • MyService - 从用户那里获取输入并将其存储在数组中 -
  • ActionController - 引用MyService数组并将其显示在视图

以上是该应用的基本结构。

Here是它的一个小问题

1 个答案:

答案 0 :(得分:0)

看起来你过度了。这不能通过框架来完成,这不能通过JavaScript解决,因为该语言没有访问控制。

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