2016-11-13 3 views
1

TSと角度を組み合わせると、コントローラ上にあるすべてのものがビューに公開されているようです。私の場合、myPrivate$ctrlに表示されます。角型1.xビューに公開されたTypescriptのプライベートおよび保護されたメンバー

class MyController extends BaseController implements SomeInterface { 
    private myPrivate: string = 'myPrivateString'; 
} 

この問題を回避する方法はありますか?

+0

プライベートメンバーを初期化するためにパラメータ化されたコンストラクタを試しましたか? – gkb

+0

私は差別だけでなく、実際の使用を防止したいと思います。 – jvrnt

+0

これは実際にはかなりの引数IMOです。ありがとう – jvrnt

答えて

1

なぜ、生成されたJavaScriptを見ればいいのかは明らかです。

var MyController = (function (_super) { 
    __extends(MyController, _super); 
    function MyController() { 
     _super.apply(this, arguments); 
     this.myPrivate = 'myPrivateString'; 
    } 
    return MyController; 
}(BaseController)); 

あなたの私有財産はあなたのコントローラ上の他のプロパティとして終わります。

フル蒸散hereを見ることができます。

解決策は、通常の$ ctrlではなく、ビューが使用するビューモデルのようなものを設定できるパラメータ化されたベースコントローラを持つことです。

それはこのようになります:

class BaseController<T> { 

    protected scope; 
    protected viewModel: T; 

    constructor(scope: any, modelType: { new(): T; }) { 
     this.scope = scope; 

     this.viewModel = new modelType(); 

     this.scope["viewModel"] = this.viewModel; 
    } 
} 

class MyParticularViewModel { 
    public somethingForTheView: string; 
} 

class MyController extends BaseController<MyParticularViewModel> implements SomeInterface { 
    private myPrivate: string = 'myPrivateString'; 

    constructor(scope) { 
     super(scope, MyParticularViewModel); 
    } 
} 

をビューで、その後、必要なプロパティにアクセスするには、のViewModelプロパティを使用することができます。

私はこれを実際にプロジェクトで使用しましたが、かなりうまく機能しました。詳細については、hereを使用したスターターテンプレートを見ることができます。

+0

+1は返事と良いアイデアを与えるために時間をとっているが、私はこれについて何か考えて、おそらくそこに何かが不足していることを望んでいた。 – jvrnt

+0

どのように表示されないのですか?コントローラーを直接ビューに挿入すると、ビューのすべてのプロパティーが使用できるようになります。 privateキーワードは、コンパイル時にtscだけが考慮に入れます。実行時に誰でも使用できるようになっています。 – toskv

+0

また、私はそれがうんざりだとは言わないでしょう。コントローラとビューの間で適切な契約を結ぶことができます(コントローラを再利用したい場合に備えて)。 – toskv

関連する問題