2016-12-12 13 views
1

私はng-modelを使用してバインドするカスタムフォームコンポーネントを作成しようとしています。私はディレクティブを使ってこれを行う方法についてのチュートリアルがたくさんありますが、コンポーネントでlinkの機能を持たせることができず、ngModelの依存関係を渡そうとしているので、このエラーのコントローラの結果:私もthisを見て試してみたAngularJSにngModelを渡す

Error: [$injector:unpr] Unknown provider: $ngModelProvider <- $ngModel 

は、この:

bindings: { 
    value: "=ngModel" 
} 

は私がすることを試みたが、その後、2ウェイバインディング用のコントローラに値を設定するが、それはdoesnのうまくいきません。

答えて

1

これは、コンポーネントの角での誤解です。コンポーネントは、独自のスコープ外のデータを変更すべきではありません。あなたがこれをしたいのであれば、あなたは実際に指令を使うべきです。 &

:私は(例えばngclickのような)コールバックを行うための角度、推奨される方法は、メソッドバインディングタイプを使用することだと思い

Components only control their own View and Data: Components should never modify any data or DOM that is out of their own scope. Normally, in Angular it is possible to modify data anywhere in the application through scope inheritance and watches. This is practical, but can also lead to problems when it is not clear which part of the application is responsible for modifying the data. That is why component directives use an isolate scope, so a whole class of scope manipulation is not possible.

+0

興味深い。では、結果を出力するためにコンポーネントがngModelを使用してはならないと言っていますか?私は許されている2ウェイバインドとは大きく異なるとは思わない。 (ただし、2ウェイバインドはあえて使用する必要はありませんが) – Brian

+0

まあ、私はドキュメントを引用しています。しかし、コンポーネント内の双方向バインディングを使用してオブジェクトを変更することは可能です。しかし、オブジェクトを置き換えることはできません。そして、ドキュメントは、これがコンポーネントを使用する意図された方法ではなかったことを暗示しているようです。さらに、実際にやりたければ、指示を使用して、あなたが得ていることを正確に知ることができます。 – Toddsden

+1

したがって、フォーム要素を作成するときにコンポーネントとして作成することはできず、単純なディレクティブとして作成する必要があります。私は、コンポーネントの要点のようなものは、 "Webコンポーネントと似ている"要素を作成できるように感じています。したがって、フォーム要素のデータへのインタフェースを提供するためのディレクティブを作成する必要はありません。コンポーネントは何らかの方法でデータをエクスポートできる必要があります。ああよく... – Incinirate

1

:ここ

documentationからの引用ですここでは、plunkrの例を示します。 https://plnkr.co/edit/nySL4OoMpJPkGXX8j78U?p=preview

この部分には、メソッドバインディングの種類が定義されています。また、internalChange関数はw親/呼び出し元によって何らかの角度表現が提供されます。

bindings: { 
     valueChanged: '&?' 
    }, 
    controller: function() { 
     this.$onInit = function() { 
      this.value = 'initial value'; 
     }; 
     this.internalChange = function() { 
      if (this.valueChanged) { 
       this.valueChanged({ $value: this.value}); 
      } 
     }; 
    } 

ここでは、多くの方法で2つの表現を使用していますが、コンポーネントによって定義されている$ valueをメモします。

<my-comp data-value-changed="$ctrl.someFunction($value)"></my-comp> <br 
<my-comp data-value-changed="$ctrl.someProperty = 'Bla: ' + $value"></my-comp> 

さまざまなことを示すために設定しようとしました。

  1. メソッドバインディングは、角度の表現をとります。私は2つの例を持っていますが、1つは親コントローラに関数を呼び出し、もう1つはプロパティを設定します。

  2. この式は、親コントローラのプロパティ、関数などにアクセスできます。 。)

  3. 成分は、キーを使用することができるという名前のプロパティがあるコンポーネントは、キー/値のマップを提供することができる

  4. 関数としてバインディング名前を実行することにより、それを呼び出すものです呼び出し元が(私の例では$値)

これは、コンポーネントが親に「プッシュ」更新を行っても問題ない限り、良い解決策です。たとえば、特定の時間(おそらく時間やメモリの制約など)でコンポーネントからデータを取得したい場合は、その問題の他の多くの解決策があります。

希望すると便利です。

関連する問題