2016-10-09 4 views
0

私はAngularJSアプリケーションを構築していますが、基本的に私のページの上にメニューがあり、アイテムを選択するとページの一部のコンテンツがスライドされ、そのエリアにメニューが表示されます。私はディレクティブを作成することについて何かを読んだことがありますが、どうすればそれを行うことができるのかはまだ分かりません。私はメニューから項目を選択すると、静的な画像disapears、その後AngularJSスライダダウンメニューを作成

enter image description here

と「サブメニュー」とサブメニューの内容自体に場所を与える:私は私のページの例を示しています。 「サブメニュー」+「コンテンツ」の高さは、画像の高さ、次に大きいいくつかのケースでは

enter image description here

は、コンテンツの残りの部分が下にスライドします。

私の主な関心事は、選択したメニュー(黒い四角形内)によってこのサブメニューを表示する方法です。私の考えは、いくつかのメニューテンプレート(すべてのhtmlとcssが作成された状態)を作成し、次にこのテンプレートに別のコンテンツをバインドして、必要なdivに表示することでした(この場合は静的イメージで始まるdiv)。しかし、AngularJSは私には新しいものなので、私はそれを細分化するためにいくつか問題があります。あなたはここにplunker例を見ることができます

+0

:$メニューコントローラでのリスナーの

例を放送し、$発し、$のために(https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope)を参照してください。メニューモデルをホストします。したがって、メインメニューからモデルを変更するサービスを作成できます。緑色のボックスでは、新しいモデルに基づいてコンテンツを再レンダリングできます。 –

+0

私はそれを行う方法の小さな例を教えてください。 –

答えて

1

https://plnkr.co/edit/xJoF4IuDtJlGzWmTYoqZ?p=preview

そしてここでは、角度コードの説明です:メニューの内容が更新されると

angular.module('plunker', []); 

function MainCtrl($scope, menuSvc) { 
    // main controller sets the menu contents to the service 
    menuSvc.putAll([{t:"item1"},{t:"item2"}]); 
} 


// a very simple menu service that keeps an object of menu items 
angular.module('plunker').factory("menuSvc", [ function() { 
    var items; 

    var clear = function(){ 
     items = {}; 
    }; 

    var getAll = function(){ 
     return Object.keys(items); 
    }; 

    var put = function(item){ 
     items[item.t] = item; 
    }; 

    var putAll = function(itemArray, dontClean){ 
     if(!dontClean){ 
      clear(); 
     } 
     itemArray.forEach(
      function(i){ 
       put(i); 
      } 
     ); 
    }; 

    clear(); 
    return { 
     put: put, 
     getAll: getAll, 
     putAll: putAll, 
     clear: clear 
    }; 
}]); 


// directive that gets its content from the service 
angular.module('plunker').directive('menu', function(){ 

    return { 
    restrict: 'E', 
    scope: { 
    }, 

    templateUrl: 'menu.html', 

    controller: function($scope, menuSvc) { 
     $scope.menu = menuSvc.getAll(); 
    }, 

    replace: true 
    }; 
}); 

あなたはディレクティブにこのイベントを通信することができます。角度イベントを介して、それは彼がサービスからコテネントを再読み込みするように。私は一般的なメニューとサービスを表示するディレクティブを作成することをお勧めしたい

$scope.$on('someEvent', function(){ 
    // update menu content 
    // trick is that you have to update the menu content, not to overwrite it 
    // for example like this: 
    $scope.menu.length = 0; 
    var newValues = menuSvc.getAll(); 
    newValue.forEach(function(x){ $scope.menu.push(x); }); 
}); 
+0

私はあなたが言ったように指令を作成することができましたが、今は問題に直面しています。私は 'getCurrentMenu'のようなイベントをブロードキャストした後、指示の側でどのようにコントローラの値でhtmlコンテンツを返すことができます –

+0

私は質問があるかどうかわかりません。ディレクティブ側では、$ scope($ getCurrentMenu、...)listenerを登録することでイベントを聴く必要があります。このイベントを受け取ったら、メニューコンテンツを更新する必要があります。 –

+0

これは、シンプルなルートとng-view?私がその部門に電話をかけたところでは、経路上の画像/メニューが拒否されましたか? –

関連する問題