1

問題を説明する最良の方法であるので、この例を見てください。

この例では、ディレクティブリンクをクリックするとテンプレートはコンパイルされず、代わりに "{{1 + 1}}"と表示されます。

「シンプルリンク」をクリックすると、テンプレートがコンパイルされ、代わりに「2」と表示されます

angular.module('myApp', []) 
 
    .provider('$popup', function() { 
 
     var service = {}; 
 

 
     this.$get = ['$compile', '$rootScope', function($compile, $rootScope) { 
 
      var template = $('<div>{{1+1}}</div>'); 
 
      service.go = function() { 
 
       $(document.body).append(template); 
 
       $compile(template)($rootScope); 
 
      } 
 
      return service; 
 
     }]; 
 
    }) 
 
    .directive('popupLink', ['$popup', function($popup) { 
 
     return { 
 
      restrict: 'A', 
 
      scope: {}, 
 
      link: function link(scope, element, attrs) { 
 
       element.click(function() { 
 
        $popup.go(); 
 
        return false; 
 
       }); 
 
      } 
 
     }; 
 
    }]) 
 
    .controller('mainCtrl', ['$scope', '$popup', function($scope, $popup) { 
 
     $scope.go = function() { 
 
      $popup.go(); 
 
     }; 
 
    }])
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script> 
 

 
<div ng-app="myApp" ng-controller="mainCtrl"> 
 
    <a ng-href="/test" popup-link>Directive link</a> 
 
    <a href="#" ng-click="go()">Simple link</a> 
 
</div>

ディレクティブでコンパイルtemplateない理由私の質問はありますか? (コントローラではありますが)

そして、指示文でもコンパイルするにはどうしたらいいですか?

P.S.代わりに$compile(template)($rootScope)

$compile(angular.element(template))(angular.element(template).scope());

http://jsbin.com/vuzutipedu/edit?html,js,output

+0

この方法を試してみてください: 'element.bind( 'クリック'、機能(){...});' –

+0

することによりデフォルト値は何ですか?アンカータグをクリックする前に? –

+0

このテクニックは本当に角度1.2を実行しているアプリで使用されていますか?それは3年前のレガシーリリースであり、多くの新しい角技法はそのバージョンでは機能しません。逆に、現在のバージョンでは、1.2で必要だったものは必要ありません。 – Claies

答えて

3

を動作するかどうか、私に教えてください:ここでは、コードで遊んしたい場合はjsbinリンクがありますこの指令はscope.$apply()を実行する必要があります。

link: function link(scope, element, attrs) { 
    element.click(function() { 
     $popup.go(); 
     //ADD apply 
     scope.$apply(); 
     return false; 
    }); 

クリックイベントハンドラは、AngularJSフレームワークの外側で実行されます。 {{1+1}}補間のためにウォッチャーを実行するには、フレームワークダイジェストサイクルを実行する必要があります。

この指令にはscope.$applyが含まれているため、ng-click指令で動作します。

からAngularJS Developer Guide (v1.1) - Concepts - Runtime

angular.module('myApp', []) 
 
    .provider('$popup', function() { 
 
     var service = {}; 
 

 
     this.$get = ['$compile', '$rootScope', function($compile, $rootScope) { 
 
      var template = $('<div>{{1+1}}</div>'); 
 
      service.go = function() { 
 
       $(document.body).append(template); 
 
       $compile(template)($rootScope); 
 
      } 
 
      return service; 
 
     }]; 
 
    }) 
 
    .directive('popupLink', ['$popup', function($popup) { 
 
     return { 
 
      restrict: 'A', 
 
      scope: {}, 
 
      link: function link(scope, element, attrs) { 
 
       element.click(function() { 
 
        $popup.go(); 
 
        //ADD apply 
 
        scope.$apply(); 
 
        return false; 
 
       }); 
 
      } 
 
     }; 
 
    }]) 
 
    .controller('mainCtrl', ['$scope', '$popup', function($scope, $popup) { 
 
     $scope.go = function() { 
 
      $popup.go(); 
 
     }; 
 
    }])
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script> 
 

 
<div ng-app="myApp" ng-controller="mainCtrl"> 
 
    <a ng-href="/test" popup-link>Directive link</a> 
 
    <a href="#" ng-click="go()">Simple link</a> 
 
</div>

+0

ありがとうございました。そのような単純なことと私はそれを理解しようと多くの時間を無駄にした。それが全く私には決して起こらなかったのでとても奇妙です。あなたは本当にその日を救った! – supersan

0

$getでこれを試してみてください、それは

関連する問題