2017-02-16 21 views
0

私は確認とキャンセルの方法で親モーダルディレクティブを持っています。子ディレクティブからAngularJS親ディレクティブスコープメソッドを呼び出す方法

 ngDialog.open({ 
      scope  : true, 
      showClose : false, 
      template : theTemplate, 
      className : 'ngdialog-theme-prompt -small', 

      controller : ['$scope', function Ctrl($scope) { 
       $scope.message = message; 

       $scope.confirm = function(){ 
        $scope.closeThisDialog(); 
        resolve(true); 
       }; 

       $scope.cancel = function(){ 
        $scope.closeThisDialog(); 
        resolve(false); 
       }; 
      }] 

     }).closePromise.then(function() { 
      resolve(false); 
     }) 

テンプレートは別の指令です。私は、サーバーにいくつかの検証とPOSTを実行して、親モーダルディレクティブ確認を呼び出すかのメソッドをキャンセルすることができるようにしたいモーダルの子ディレクティブで

<form class="edit-stakes-content"> 
    <ul> 
     <li ng-repeat="stake in settings track by $index"> 
      <input type="number" name="input" pattern="^\d+$" min="0" value="{{stake}}" /> 
     </li> 
    </ul> 
    <div class="edit-stakes-control"> 
     <button ng-click="cancel();" class="apl-btn apl-btn-link apl-btn-large" translate>CANCEL</button> 
     <button ng-click="confirm();" autofocus="true" class="apl-btn apl-btn-update apl-btn-large" translate>SAVE</button> 
    </div> 
</form> 

これと同様に

:親メソッドを呼び出す

Directive.$inject = ['UserSettings']; 

function Directive(UserSettings) { 
    function Link($scope) { 

     $scope.settings = angular.copy(UserSettings.get('presetStakeSettings').settings); 

     $scope.cancel = $scope.$parent.cancel(); 

    } 

    return { 
     'link': Link, 
     'restrict': 'E', 
     'replace': true, 
     'templateUrl': 'betting/edit-stakes/edit-stakes.html' 
    } 
} 

ドルスコープの$ parent.cancelがまだ関数ではない仕事をしているようだJavaScriptエラーがスローされます。

JavaScriptエラーなしで子通信を親通信にするより良い方法はありますか?

答えて

0

$scope.$parentは一般に反パターンと見なすことができますが、それはほとんど役に立ちません。通常、指示のデザインやスコープの継承に問題があることがよく分かりません。

Directiveディレクティブは新しいスコープを要求しないため、modalコントローラのスコープと同じスコープであると見なすことは安全です。つまり$scope.$parentは、cancelプロパティを持たないモーダルスコープの親(ルートスコープの可能性がある)を指します。

これは、$scope.settingsの割り当てがコントローラーの有効範囲に影響することを意味しますが、明らかにそうしてはいけません。この指示文に継承されたスコープをscope: trueとする方がよいでしょう。

scope: trueがあるかどうかは関係ありませんが、$scope.cancelは指示に記載されています。モーダルスコープから継承されます。何もする必要はありません

$scope.cancel = $scope.$parent.cancel(); 
関連する問題