簡體   English   中英

如何從一個控制器隱藏數據,但使用共享服務與另一個控制器共享數據

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

我剛剛發現如何使用存儲陣列並將其通過引用傳遞給第二個控制器的服務在控制器之間共享數據。

服務是否可以通過第一個控制器保護陣列,因為該控制器僅需要將一項傳遞給服務即可。 該陣列僅由第二個控制器使用。

  • ModalController接受用戶輸入
  • MyService接受用戶輸入並將其存儲在數組中-
  • ActionController具有對MyService數組的引用,並將其顯示在視圖上

以上是該應用程序的基本結構。

是一個jsfiddle

看來您在過度操作。 由於該語言沒有訪問控制,因此不能通過框架來完成,也不能通過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編譯錯誤。

這種方法是過度工程的一個例子。 即使指定了正確的接口,也沒有人可以禁止開發人員在某個時候用IDuplexFooService類型替換IWritableFooService OOP最佳實踐源於實際考慮,似乎沒有。 但是可以,可以使用TypeScript做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM