【问题标题】:How do I hide data from one controller but share it with another controller using a shared service如何从一个控制器隐藏数据但使用共享服务与另一个控制器共享
【发布时间】:2017-04-24 20:59:26
【问题描述】:

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

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

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

以上是应用的基本结构。

Here 是它的杰作

【问题讨论】:

  • 请提供您要执行的操作的实际代码。代码描述永远不会起作用。目前尚不清楚“隐藏”和“保护”指的是什么。您从谁“保护”这些数据?为什么?
  • 对不起,我在编辑的问题中添加了一个 jsfiddle。我想知道是否有办法阻止 ModalCtrl 访问数组。
  • 实际上并没有您所说的“保护”概念。 Javascript 中没有私有变量。事物只被上下文隐藏。如果您不希望您的控制器访问该阵列......只是不要访问该控制器中的阵列。
  • 如上所述,没有办法做到这一点,我想不出这样做的充分理由。首先解释为什么你需要这样做会有所帮助。如果你不阻止控制器会发生什么?由于该服务具有公共接口,因此任何控制器或任何东西都可以使用passChore。您可以创建另一个功能有限的服务来包装这个服务并且不公开passChore 方法......但是有什么用呢?
  • 我只是想知道。不是我想做的事情。考虑封装和数据隐藏等概念。我认为由于 ModalCtrl 不需要访问数组,因此最好防止它访问数组。

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


【解决方案1】:

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

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

如果这是一个由您开发并将由第三方使用的库,则不应从外部使用的方法可以标记为“内部”并相应地命名。 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 可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多