2012-06-11 13 views
5

私はコントローラを定義しており、スコープにはいくつかの変数があります。コントローラーの外で直接変数スコープに値を割り当てる方法があるかどうかを知ることができますか(ng-modelではありません)。また、コントローラの機能を、ng-clickの代わりに、Webページの<script>要素のどこかで直接呼び出すことはできますか?Angularjsで直接コントローラとスコープと対話する方法はありますか?

ありがとうございます!

乾杯、クリス

答えて

11

は、角度のコントローラの定義は、実際のクラスではなくオブジェクトです。コントローラが参照するHTML内の各場所は、コンパイルフェーズ中に、定義されたコントローラクラスを使用して新しいコントローラオブジェクトを作成します。したがって、同じコントローラクラスで複数のスコープを参照することができます。

コントローラに関連付けられているスコープは常にあり、すべての変数はそのスコープにバインドされています。あなたは、あなたが、コントローラの外部からスコープにアクセスしようとしている理由をお聞かせ場合、それはまた良いでしょう

var scope = angular.element("#myelement").scope(); 
//use the scope.... 

のようなものを呼び出すことにより、特定のHTML要素の範囲をアクセスすることができました。

UPDATE

これは、ブートストラップタブコンポーネントです...あなたは、私はちょうどそれを更新しました。これはhttp://angularjs.org/メインページに存在するものと同じである

<tab> 
<pane title="tab1"><pane> 
<pane title="tab2"></pane> 
</tabs> 

としてこれを使用することができますタブが変化したときにイベントをブロードキャストします。

var directives = angular.module('myApp.directives', []); 
directives.directive('tabs', function() { 
    return { 
     restrict:'E', 
     transclude:true, 
     scope:{}, 
     controller:function ($scope, $element, $rootScope) { 
      var panes = $scope.panes = []; 

      $scope.select = function (pane) { 
       angular.forEach(panes, function (pane) { 
        pane.selected = false; 
       }); 
       pane.selected = true; 
       $rootScope.$broadcast("tabChanged", pane.title); 
      } 

      this.addPane = function (pane) { 
       if (panes.length == 0) $scope.select(pane); 
       panes.push(pane); 
      } 
     }, 
     template:'<div class="tabbable">' + 
      '<ul class="nav nav-tabs">' + 
      '<li ng-repeat="pane in panes" ng-class="{active:pane.selected}">' + 
      '<a href="" ng-click="select(pane)">{{pane.title}}</a>' + 
      '</li>' + 
      '</ul>' + 
      '<div class="tab-content" ng-transclude></div>' + 
      '</div>', 
     replace:true 
    }; 
}); 
directives.directive('pane', function() { 
    return { 
     require:'^tabs', 
     restrict:'E', 
     transclude:true, 
     scope:{ title:'bind' }, 
     link:function (scope, element, attrs, tabsCtrl) { 
      tabsCtrl.addPane(scope); 
     }, 
     template:'<div class="tab-pane" ng-class="{active: selected}" ng-transclude>' + 
      '</div>', 
     replace:true 
    }; 
}); 

これは基本的に私は同時にangularjsとブートストラップ(タブJavaScriptのコンポーネント)を使用したいタブの変更..

+0

イベントを送出します。私はRESTアーキテクチャを実装しており、ユーザーが別のタブペインに切り替えるたびにリソースを取得したいと考えています。だから、私はタブの変更イベントにバインドし、この快適なWeb​​サービスから検索するためにコントローラの関数を呼び出す必要があります。また、安らかなWebサービスから取得するとき、私はユーザーIDを指定する必要があります。私は最初にユーザーIDを固定していますが、コントローラ内のIDまたはjsファイル内のスコープをハードコアしたくありません。 – Chris

+0

したがって、変数(ユーザID)をスコープに設定し、コントローラの機能(安静なWebサービスからデータを取得する)を外部から呼び出す必要があります。どのようにこれを達成することができますか?ありがとう! – Chris

+0

可能であれば、カスタムディレクティブを使用しないようにしたいと思います。すべてのブラウザがカスタムディレクティブをサポートしているとは限りません。しかし、あなたの考えに感謝します。 – Chris

関連する問題