0

次のウィジェット属性のカスタム ディレクティブを作成しました。

<div widget></div>

基本的に、ディレクティブはいくつかのテンプレート コードを作成し、html をウィジェット タグ内に配置するだけです。ディレクティブは次のとおりです。

skdApp.directive("widget", function() {
  return {
    restrict: 'A',
    template: htmlTemplate,
    link: function($scope, element, attri) {
      /*
       * setup event handler and twitter bootstrap components here
       */
    }
  }

htmlTemplate は、カスタム ディレクティブ (<seal>タグなど)も使用する基本的な html コードです。

var htmlTemplate = '<div ng-controller="OfferCtrl">' +
                     '<div class="container">' +
                       <seal></seal>' +
                       '...'+
                     '</div>' +
                   '</div>';

私のコントローラーでは、最初に <div widget> に表示するデータを要求します。サーバーからデータを要求するためのすべてのロジックをカプセル化する「オファー」サービスがあります。私が使用しているメソッドは、Offer.query() と呼ばれます。

skdApp.controller('OfferCtrl', function OfferCtrl ($scope, Offer) {
  var o = Offer.query({id: 1}, function (response) {
    $scope.offer = response;
  });
});

応答ハンドラーで、結果をスコープにバインドしています。私が今直面している問題は、ディレクティブもデータを要求しますが、この要求は Offer.query() から受信したデータに依存することです。つまり、Offer.query() からの応答は ID (myID と呼びましょう) を返します。これは、seal ディレクティブがさらにデータを要求するために必要です。したがって、すべてのロジックをコールバックの Offer.query コールバック関数に入れるだけです。これは最善の方法ではないようです。

そこで、この部分を<seal>ディレクティブのリンク機能に移動することを考えていました:

skdApp.directive("seal", function() {

  var sealHTML = '<div>{{offer.data.foobar}}</div>';

  return {
    restrict: 'E',
    template: sealHTML,
    link: function($scope, element, attrs) {

      $scope.$watch('offer.myId', function (newValue, oldValue) {

       if (typeof newValue !== "undefined") {

         /* request more data with myId 
          * and bind the result to offer.data
          */    

       }

      });

    }
});

このアプローチは「角度」に準拠していますか、それとも角度でこれを行うための(構造に関して)他のより良い方法はありますか?

4

2 に答える 2