3

をディレクティブにパラメータを送信する正しい方法私は角度を少し新たなんだ、と私はディレクティブに関する「正しい」やり方で角度活用する方法についてのグリップを取得しようとしています。角度:

私のユースケースは、私は角度& ThreeJSで3Dプロジェクトビューアを開発していますということです。ユーザーは、彼が見ることができる異なる「プロジェクト」を持つことができます。

人が見るために他の人に特定のプロジェクトをリンクすることができるように、我々は、プロジェクトの識別を利用したい方法は、URLパラメータを使用することです。私たちは、私はそれを理解してきたように

... 
    <viewer></viewer> 
... 

を以下のように、視聴者を定義することができるように

ビューア/レンダラーは、ディレクティブとして定義され、viewer-にURLパラメータを提供するために、いくつかの異なる方法があります。私は$ stateParamsを利用してurlからパラメータにアクセスしようとしています。しかし、私が作業を続けると、$ stateParamsにアクセスするための "明確な"方法はありませんが、コントローラーをディレクティブに接続してそこからアクセスする必要があります。

これはこれを行うための意図した方法ですか?それともビューア・ディレクティブの属性として定義する必要がありますか?もしそうなら、どうすればhtmlコードのurlパラメータにアクセスできますか?または、3番目に優れたオプションがありますか?

あなたはおそらく、私は角にちょっと新たなんだ理解し、私は主に私が先頭で今くらいに台無しにしないように、角度の使用目的のグリップを取得したいと。

よろしくお願いいたします。

答えて

2

あなたはとても文字列を渡すことになるよう@が、ここでより多くの意味になり、あなたのurl parameters via scopeにアクセスすることができます:あなたのディレクティブで

scope: { 
    datasource: '@' 
} 

をあなたはこのように値を渡すことができます:

<viewer datasource={{urlParamValue}}></viewer> 

そして、 controllerでは、次のようにURLパラメータを収集することができます。

function Controller($scope, $location){ 
    var urlParamValue = $location.search().urlParamValue;  
} 
+0

あなたの答えは、スコープ宣言から離れて良いです。まず、フィールドの名前を変更しない限り、 '@'の後ろに名前は必要ありません。 'datasource: '@ datasource''は冗長で、' datasource:' @ ''と同じです。次に、一方向の '<'または双方向の '= 'バインディングが必要です。または、テンプレートの中括弧で' urlParamValue'をラップする必要があります。さもなければ、あなたのディレクティブの実際のurl paramではなく、 'urlParamValue'という文字列で終わるでしょう。 – PerfectPixel

+0

@PerfectPixel:変更ああおかげで... ...私はそのURLパラメータ値として...我々はここに結合双方向のデータを必要としそうは思いませんし、そのほとんどが文字列になるだろう... – Thalaivar

+1

どうもありがとうございました。私はあなたがここで言及したものを利用することができました。その背後には良い設計があるかもしれませんが、サービスやコントローラにたくさんのクールなパラメータを注入できることを学んだばかりの場合、同じことがディレクティブに当てはまらないときに少し不満を感じます。 –

1

以下のように双方向バインディングを使用することができます。

scope: { 
    datasource: '=datasource' 
}