2016-03-17 7 views
6

私はフォームを含むテンプレートを持つコンポーネントを持っています。angularjsコンポーネントはテンプレート内にフォームを取得します

mycomponent.html:

<div> 
    <form name="myForm"> 
     <!-- more html code --> 
    </form> 
</div> 

私はコンポーネントコントローラの内部であるmyFormにアクセスするにはどうすればよいですか? 現在、私はそれを得るために$ scopeを注入しています。 それはフォームを取得する唯一の方法ですか?

編集:より良いJavaScriptの

angular.module('example') 
.component('myComponent', { 

    templateUrl: 'mycomponent.html', 
    controller: function($scope) { 
     $scope.myForm // This works 
     this.myForm // undefined, can I access it through the component scope instead of $scope somehow? 
    } 
}); 
+0

を参照してください名の構文を使用しますが、またコンポーネントは、ライフサイクルフックをポストリンク、その関数は、テンプレートとコントローラが接続されていた回呼び出されます直接フォーム。フォーム要素自体にアクセスする必要がありますか? – Dave

+0

$ pristine、$ valid e.t.cをチェックしたかったのです。 –

答えて

18

に説明するためにいくつかのコードを追加し、フォームのname属性は、角の用途がバインドするかを決定するものです。だから、あなたはcontrollerAs構文を使用している場合、フォームの名前でそれを使用する必要があります。

<body ng-controller="MainCtrl as vm"> 
    <form name='vm.myForm'> 
    </form> 
    </body> 

これは$スコープを使用せずに、コントローラにそれを参照することができますが、コントローラは持っていた後にのみ正常に作成されました:

app.controller('MainCtrl', function($scope, $timeout) { 

    var vm = this; 

    console.log(vm.myForm); // undefined 

    $timeout(function() { 
     console.log(vm.myForm); // FormController object 
    }, 100); 
}); 

ここでは、作業はplunkです。

+1

コンポーネントを使用していて、 "mainctrl as vm"を知っている限り、それは少し修正されています。

を名前として使用し、角度コンポーネントでこのようにアクセスできます。 –

+1

角度1.5を使用していますか?コンポーネントの場合でも 'controllerAs'のデフォルト値として' $ ctrl'を自動的に追加します。 – Dave

+0

はい、角1.5と私が参照してください。未来を知っておいてよかった!それは、単純な範囲で扱うことができたときに –

関連する問題