8

これらの質問をたくさん見てきましたが、有効な解決策が見つかりませんでした。これは機能しないが機能するはずのフィドルです。

http://jsfiddle.net/cdparmeter/j2K7N/2/

コントローラ:

$scope.foo = function (textArray) {
    console.log(textArray)
};

指令:

return {
    restrict: 'E',
    replace: 'true',
    scope: {
        methodToCall: '&method'
    },
    template: "<div>
        <input ng-model='textToPush'/>
        <button ng-click='pushText'>Push</button>
        <button ng-click='finish'>Finish</button>
    </div>",
    link: function (scope, element, attrs) {
        scope.paragraphs = [];
        scope.pushText = function () {
            scope.paragraphs.push(scope.pushText);
            scope.pushText = "";
        }
        scope.finish = function () {
            scope.methodToCall(scope.paragraphs)
        }
    }
}

HTML:

<div ng-app="MyApp">
    <div ng-controller="MyController">
        <container data-method="foo">
    </div>
</div>

親スコープのコントローラーでカスタム処理が必要なディレクティブ内に配列を作成しています。ディレクティブに渡すモデルの親スコープに時計を投げることができることは知っていますが、それはハックで汚いようです。助言がありますか?

4

1 に答える 1

13

あなたの質問に答える前に、あなたのスクリプトにはいくつかのエラーが含まれていると言わなければなりません:

  1. 入力を という変数にバインドしtextToPush、関数内で別の変数を使用していpushTextます ( pushText);
  2. ng-clickディレクティブを正しく設定していません。ng-click="pushText()"の代わりにする必要がありng-click="pushText"ます。についても同じですfinish

さて、あなたの質問に戻ります。引数を渡す親スコープの関数を呼び出すには、まずその関数への参照を取得してから実行します。

scope.finish = function () {
  var func = scope.methodToCall();                
  func(scope.paragraphs);
}

これがスクリプトの作業バージョンです。

必要に応じて、これを行うこともできます。

scope.finish = function () {
    scope.methodToCall({value: scope.paragraphs});                                
}

ただし、このコードを機能させるには、マークアップを次のように変更する必要があります。

<container data-method="foo(value)"/>

上記のソリューションを示す別の jsFiddleを次に示します。

于 2013-10-03T03:44:20.757 に答える