2017-04-08 10 views
0

私はhttp://www.codelord.net/2016/05/13/understanding-angulars-and-binding/に従って、AngularJSコンポーネントのコールバックを実装しようとしています。 https://plnkr.co/edit/dxyI0p0pZFZdMalLfvXO?p=previewに、私が持っている問題を説明しようとしました。コンポーネントを次の3つの異なる方法でインスタンス化します。コンポーネントのコールバックが正常に動作しないのはなぜですか?

<section id="main-content" ng-controller="myPageController as ctrl"> 
<my-component label="Scope" myChange="cb()"></my-component> 
<my-component label="Ctrl" myChange="ctrl.cb()"></my-component> 
<my-component label="Page" myChange="page.cb()"></my-component> 
</section> 

しかし、どれも動作しません。コンポーネントのチェックボックスに関連付けられた関数によって記録されたメッセージが表示されますが、コールバックからのメッセージは表示されず、エラーも表示されません。私は何が欠けていますか?

+0

コード・エルフは昨日私のPlunkerに手を差し伸べました。今日は機能しているようです。なぜ私に謎があるのですか? –

+0

私はこれをもう一度見直して、作業中のPlunkerと私のコードとの間に大きな違いがあることに気付きました。私は、使用した 'the-identifier'からコンポーネントに実装されている' theIdentifier'への変更を無視していました。 –

答えて

0

"onchange"はHTML要素の予約属性です。 myChangeのように別の名前を使用します。 ここhttps://www.w3schools.com/tags/att_onchange.asp

+0

そのアドバイスをいただきありがとうございます - 私は名前を変更しますが、 "onChangeCb"に "onChange"を変更すると、インスタンス化のいずれのエラーも発生しませんが、コールバックは呼び出されません。 –

+0

私は 'onChange'では、関数をコールバックとして呼び出すコンポーネントではなく、要素に結びついた別のイベントハンドラがあると考えています。これは、コールバックがまったく呼び出されない私のアプリケーションの私の元の失敗に実際に近いです。 –

0

を参照してくださいすることはPlunkerです:https://embed.plnkr.co/OYpLu8/

あなたはこれにmyPage.incを提出変更する場合:

<section id="main-content" ng-controller="myPageController as ctrl"> 

    <h2>This is the page.</h2> 
    <my-component label="Scope" ng-model="confirmed" ng-change="cb()"></my-component> 
    <my-component label="Ctrl" ng-model="confirmed" ng-change="ctrl.cb()"></my-component> 
    <my-component label="Page" ng-model="confirmed" ng-change="page.cb()"></my-component> 

</section> 

をしかし、それは唯一のng-change問題を解決します。

これらのng-modelは何もしません、このモデルconfirmedはどんなコントローラにも存在しません、ちょうどng-changeの作品です。


編集:あなたが呼び出されるこの関数にディレクティブに関数を渡す必要があります。あなたが行う方法は、あなたの指示の中にscopeを作成することです。

'scope': { 
    'yourFunction': '&' 
} 

そして、あなたのcomponent内で呼び出します。

<label>{{vm.label}}</label> 

<input type="checkbox" ng-click="vm.handleCheckboxClick()" ng-model="confirmed" ng-change="yourFunction()"/><br> 

そして今、あなたは部外関数を呼び出したい毎回、あなたはあなたのcomponentに、この関数を渡す必要があります。

<my-component label="Scope" your-function="cb()"></my-component> 
<my-component label="Ctrl" your-function="ctrl.cb()"></my-component> 
+0

フィードバックをいただきありがとうございますが、私は私の見たPlunkerで同じ動作を見ています。たとえあなたのテクニックが機能したとしても、コンポーネントコールバックの一般的な問題ではなく、変更トラッキングの特定の問題が解決されます。 –

+0

私はあなたに正しく答えるために編集しました。私はあなたの問題を解決することを願っています。 –

+0

チェックボックスが変更されたときに、コンポーネントに渡す関数をあなたのように呼び出すコードがあります。しかし、私はすべてのチェックボックスで 'ng-change'ハンドラとして割り当てる必要があることが奇妙に思えます。私は、コンポーネントコントローラが適切なときに呼び出すことができる、より一般的なソリューションを本当に必要としていました。同様に、コンポーネント内に複数のチェックボックスがあり、それらがすべて同じ状態になっているときにコールバックを呼び出すことができます。 –

関連する問題