プロミスを設定し、それをディレクティブにスローして(データバインディング「=」属性タイプを使用)then
、ディレクティブ内で魔法を実行したいのですが、プロミスを属性として渡すと、プロミスが次のように解決されるようですundefined
であるため、then
(およびその他の promise 機能) は使用できません。
2 に答える
これは、次の特定の調整によるものと思われます。
$q promise は、Angular のテンプレート エンジンによって認識されます。つまり、テンプレートでは、スコープにアタッチされた promise を結果の値であるかのように扱うことができます - angular $q docs
これにより、プロミスはテンプレート内で$$v
結果の値を保存するためにプロミスが使用する値に変換されます。リンク段階では、プロミス自体ではなく、変換された値 (未定義) のままである可能性があります。その後、ディレクティブに渡されます。
回避策は、プロミス自体をディレクティブに渡される属性として使用するのではなく、それを親オブジェクトの一部にすることです: 親オブジェクトは $q/template エンジン マジックを実行しないため、次のことが可能になります。親から promise にドリルダウンし、then
そこから機能にアクセスします。
例についてはhttp://jsfiddle.net/cebjyre/95sjT/を参照してください- 32行目のコメントを外すと、その時点でトップレベルのプロミスが実際にはプロミスでなくなるため、失敗が発生しますが、17行目の2番目のレベルのプロミスは正常に機能します
ありがとう。これを Angular ドキュメントに追加しました。
http://docs.angularjs.org/api/#comment-984109158
これを達成するには、プロミスを親でラップします: $scope.myDirectiveAtrribute = {promise: deferred.promise} そして、ディレクティブでプロミスにアクセスします
$scope.myDirectiveAtrribute.promise.then(関数(){});