2017-02-20 6 views
0

で、私は私が指示および範囲によって指定されたパラメータでコールバックを実行できるようにしたいのですが、かなりシンプルなディレクティブを持っています。例:AngularJS指令を実行するコールバックはPARAMS

<div ng-repeat="user in users"> 
    <div sample="..." callback="welcome(user, $message)"> 
    </div> 
</div> 

これを処理するには、$parseの使用に問題があります。私のサンプルディレクティブは次のとおりです。

app.directive('sample', ['$parse', function ($parse) { 
    return { 
    restrict: 'A', 
    scope: {}, 
    link: function (scope, element, attrs) { 
     // ... 
     function greet() { 
     var callback = $parse(attrs.callback); 
     callback(scope, { $message: 'Howdy' }); 
     } 
    }, 
    }, 
}]); 

をしかし、$の解析から機能を取得するにもかかわらず - (:角1.5.xの上のノート)と呼ばれている(コントローラで定義されている)私の歓迎の機能につながることはありません機能を実行します。私はスコープが何とか間違っていると仮定しています(それは親スコープの代わりに隔離されたスコープを使用しています)。 - しかし、隔離されたスコープが必要です。私は間違って何をしていますか?

+0

userオブジェクトを提供したい、あなたは '$のparse'や一般的な指示を必要としますか?これが1つのコントローラの場合は、コントローラに '$ scope.greet'を定義することができます。 –

+0

ディレクティブは、それらの定義に異なるパラメータ(およびオプションの「$メッセージ」)を持っている(そうでないことも可能)複数のコントローラと「コールバック」のために使用されます。 – Stussa

答えて

2

あなた$parseコールにパラメータとしてscope.$parentを使用することはできますか? $scope.$apply(function() { ... });でラップすることもできます。

+0

私はスコープがどの親この作品 – Phil

+0

へのアクセス権を持って分離するとは思いません。これはどこかに書かれていますか? – Stussa

+1

@phil隔離されたスコープの$ parentは常に親スコープを参照します。分離されているということは、親スコープからプロトタイプ的に継承されないことを意味します。* NOT *は$ parentが定義されていません。 –

0

あなたは& isolate scope bindingを使用することができます。私はまた、あなたのディレクティブに

return { 
    restrict: 'A', 
    scope: { 
    user: '<', 
    callback: '&' 
    } 
    link: function(scope) { 
    // ... 
    function greet() { 
     scope.callback({ 
     user: scope.user, 
     $message: 'Howdy' 
     }) 
    } 
    } 
} 

<div sample="..." user="user" callback="welcome(user, $message)"> 
+0

このソリューションは、ユーザーとディレクティブの間にかなり強い結合が追加されます(私は避けるようにしようとしているとディレクティブをできるだけジェネリックにする)。私は、 'ng-click'のようなディレクティブをいくつかの重要なパラメータで埋める場所に近づけることを目指していますが、そうでなければ外部の出来事について知る必要はありません。私は理想的には次のようなものをサポートする必要があります: 'callback =" welcome() "'と 'callback =" welcome(user) "'と 'callback =" welcome(item、$ message) "'と 'callback =" welcome (item、user、$ message) "'を返します。 – Stussa

+0

@Stussaそれは密結合ではなく、単にディレクティブのAPIの一部になります。いずれにせよ、私はあなたのために働くソリューションを見つけられてうれしいです – Phil