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

How do I hide data from one controller but share it with another controller using a shared service

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

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

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

Here 是它的一个 jsfiddle

看来你做得太过了。这个用框架做不到,用JavaScript也解决不了,因为语言没有权限控制

MyServicegetChorepassChore 方法作为其 public 接口,任何使用该服务的单位也可以使用这两种方法。这很好。如果两个控制器都是你自己开发的并且你没有真正的理由限制访问,请在这里应用奥卡姆剃刀,不要再看。

如果这是一个由您开发并将由第三方使用的库,则不应从外部使用的方法可以标记为 'internal' 并相应地命名。 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 最佳实践源于实际考虑,似乎有 none。但是,是的,可以使用 TypeScript 做到这一点。