2016-11-22 1 views
0

問題を説明する前に正確に何をしようとしているのかを説明します。私はフォームを保持するディレクティブを持っており、フォームが有効であることを確認するためにサブミット・ボタンをクリックすると、親エレメント(ディレクティブが使用される)からそのフォームにアクセスする必要があります。

これを行うには、私は$scope.$parent[$attrs.directiveName] = this;を使用して、this.isValidのような、ディレクティブにいくつかのメソッドをバインドして親に公開して実行しようとしています。

ローカルで実行しているときにうまく動作しますが、コードを細工してビルドするときに、aProviderがコントローラの$scopeProviderエラーにトレースされたエラーが発生します。

私は過去に同様の問題を抱えていましたが、最初に考えたのは、$scopeのために具体的に$injectと言う必要があるということでした。しかし、悲しいかな......運がない。

私が間違っていることが明らかに明白なことはありますか?

助けてください。

+1

私はディレクティブからコンポーネントhttps://docs.angularjs.org/guide/componentに変更します。次に、入力と出力のアイデアを使用して、親コンテナとコンポーネントから通信します。あなたがしていることは、それを行う正しい方法ではありません。 – Stevo

+0

Jeezさんは、Angular 1.xに '.component'が追加されたことを認識していませんでした。この既存のロジックをコンポーネントに変換する助けは、実際には非常に高く評価されます。 – germainelol

答えて

0

ディレクティブをコンポーネントに変更して、クリアなインターフェイスを実装します。

親コンテナ(parent.html):

<form-component some-input="importantInfo" on-update="someFunction(data)">  
</form-component> 

親コントローラ(parent.js):

//... 

$scope.importantInfo = {data: 'data...'}; 
$scope.someFunction = function (data) { 
    //do stuff with the data 
} 

//.. 

form-component.js:だから

angular.module('app') 
.component('formComponent', { 
    template:'<template-etc>', 
    controller: Controller, 
    controllerAs: 'ctrl', 
    bindings: { 
    onUpdate: '&', 
    someInput: '<' 
    } 
}); 

function Controller() { 

    var ctrl = this; 
    ctrl.someFormThing = function (value) { 
    ctrl.onUpdate({data: value}) 
} 

} 

フォームでのイベントは、機能ctrl.someFormThing(data)をトリガした場合。これはctrl.onUpdate()を呼び出すことによって親に渡すことができます。

+0

'onUpdate'呼び出しを手動でトリガしたくない場合はどうしますか?私の場合、私はフォームを持っており、そのフォームが有効かどうかを親から知る必要があります。私は現在 'form。$ valid'を返す' isValid'メソッドを持っています。したがって、Component構文を使用して、それを親からどのようにアクセスできますか? – germainelol

+0

ちょうど明らかにする。親には、フォームを含む子ディレクティブが含まれています。親は、フォームの状態が変更されたときに通知を受ける必要がありますか?あるいは、親はフォームの状態を「要求」する必要がありますか?いずれにせよ、あなたはonUpdateを使うべきです。したがって、フォームに$ watchをつけて、$ validを呼び出し、それが変更された場合はonUpdateを呼び出すことができます。次に、あなたの親では、それが呼び出される関数は、ターゲットがフォームの親の「ローカル」状態を変更することです。あなたが望むなら、あなたは2ウェイバインディングを持つことができます。しかし、それはアドバイスされていません。コンポーネントのドキュメントを読んでください。 – Stevo

関連する問題