私は、基本クラス(活字体)に(アンギュラ材質から)$ mdToastの単一のインスタンスを置くことについての具体的な質問があります。 UIに5つのタブがあり、それぞれに別々のコントローラーインスタンス(つまり、注入とctorの宣言を分けて)を与えました。 $ mdToast宣言をどこにでも別々に宣言するのではなく、基本クラスに移動するのが理にかなっていました。基底クラスは独自の "$ inject"を持っていますが、それは派生クラスのものに取って代わられているようです。私は$ mdToastを共通の基底クラスに移動する最もクリーンな方法を見つけようとしています。最善の方法は何ですか?ここで私のコードはどのように見えるです。元$ mdToastラインがコメントアウトされて単一インスタンス/注入
注:以下の基底クラスと
export class MainController extends BaseController {
static $inject = [
'tableService',
'$mdSidenav',
//'$mdToast',
'$mdDialog',
'$mdMedia',
'$mdBottomSheet'];
constructor(
private tableService: ITableService,
private $mdSidenav: angular.material.ISidenavService,
//private $mdToast: angular.material.IToastService,
private $mdDialog: angular.material.IDialogService,
private $mdMedia: angular.material.IMedia,
private $mdBottomSheet: angular.material.IBottomSheetService) {
super();
var self = this;
}}
。 $ mdToastの注入と$ mdToastの宣言がコンストラクタの外側にあることに注意してください。
export class BaseController {
static $inject = [
'$mdToast'];
constructor(
) {
var self = this;
}
private $mdToast: angular.material.IToastService;
openToast(message: string): void {
this.$mdToast.show(
this.$mdToast.simple()
.textContent(message)
.position('top right')
.hideDelay(3000)
);
}}
私はSOのどこか別のところで$ injectorを賢明に使用していましたが、それは私のためには機能しませんでした。すべての反応がうれしく受け取りました!
あなたの声明に興味深い知恵。あなたは私に多くのことを考えさせました。 2番目の例では、まだ回避しようとしていた$ mdToastを2回注入する必要があります。 BaseControllerを継承しているすべてのクラスで、$ mdToastのインスタンスを1つしか取得できないようにするにはどうすればよいですか? (btw、i upvoted) –
Dupe '$ mdToast'はここに正しいです。とにかくインジェクタによるコンストラクタ引数として渡されます(これはクラスデコレータで修正できますが、正直言ってそれは価値がありません)。しかし、これは 'this'に1度だけ割り当てられ、可視性をオーバーライドできません(親クラスのコンストラクタで' protected $ mdToast'があり、子クラスのコンストラクタでは '$ mdToast'のみです)。もちろん、 '$ mdToast'はコントローラインスタンスごとに1回だけ注入されます。クラスが継承されているかどうかは関係ありません。継承がどのように動作するかです。 – estus
週末やハリケーン・マシューからのすべての難民の間、私はあなたの変更を実行することに決めました。彼らは約束どおりに働きます。私はまだWETする必要があるのが嫌いですが、それについてのあなたのコメントは、TypeScriptのタイプセーフを私に響かせておくための最良の方法です。私はハードコアのC++/Java/C#のバックグラウンドから来て、Javascript/TypeScriptでこのように考えてみると、過去に比べてより柔軟にする必要がある良い場所です。 –