首頁  >  文章  >  web前端  >  Angularjs讓控制器之間相互通訊(附程式碼)

Angularjs讓控制器之間相互通訊(附程式碼)

php中世界最好的语言
php中世界最好的语言原創
2018-05-03 10:57:511159瀏覽

這次帶給大家Angularjs控制器之間互相通訊(附程式碼),Angularjs讓控制器之間相互通訊的注意事項有哪些,下面就是實戰案例,一起來看一下。

利用angularjs開發專案中,控制器之間的通信,例如參數的傳遞,資料的傳遞,都是比較常見的。控制器之間的通信,顯得特別重要。常見的方式有以下兩種:一、angular服務的方式;二、基於事件廣播的方式;另外,還有基於作用域繼承的方式。以下先說一下前兩種方式:

一、基於angular服務的方式:

在angular中服務是一個單例,所以在服務中產生一個對象,該對象就可以利用依賴注入的方式在所有的控制器中共享。參考以下例子,在一個控制器修改了服務物件的值,在另一個控制器中取得到修改後的值:

var app = angular.module('myApp', []);
app.factory('Myservice', function(){
 return {};
});
//定义服务
app.controller('Ctrltest1', function($scope, 'Myservice') {
 $scope.change = function() {
  Myservice.name = $scope.test; //在第一个控制器中为服务对象赋值
 };
});
app.controller('Ctrltst2', function($scope, 'Myservice') {
 $scope.add = function() {
  $scope.name = Myservice.name; //将第一个控制器中为服务对象赋的值传给第二个控制器
 };
});
<p ng-controller=&#39;Ctrltest1&#39;>
  <input type="text" ng-model="test" />
  <p ng-click="change()">click me</p>
</p>
<p ng-controller=&#39;Ctrltest2&#39;>
 <p ng-click="add()">my name {{name}}</p>
</p>

二、基於事件廣播的方式

基於事件廣播,需要用到$emit()$broadcaset()$emit()這三個方法。

1. 向父作用域層次結構發出自訂事件:使用$emit()方法,scope.$emit(name,[args,...])

附註:name是事件名,args 是0個或多個參數。

應用程式場景:用於子頁面控制器傳送參數給父頁面的控制器。

2. 向子作用域層次結構廣播自訂事件:

應用程式場景:用於父頁面控制器向子頁面的控制器傳遞參數或同級控制器之間傳遞參數。

使用$broadcaset()方法,$scope.$broadcaset(name,[args,...])

註:name是事件名,args 是0個或多個參數.

3. 使用偵聽器處理自訂事件

為了處理發出或廣播的事件,可以使用$on()方法。 $on()方法將使用下面的語法:

$scope.$on(name,listener)

附註: name 是將要偵聽的事件的名字,listener參數是一個函數,它將接受事件作為第一個參數,接受$emit()$broadcaset()方法傳遞的其他所有參數作為隨後的參數。 $on()方法主要用於監聽$emit()$broadcaset()方法中事件的變化,例如這兩個方法中如果有變數改變,$on()方法將會取得到該變數的改變。

參考以下例子,在一個控制器修改了變數的值,在另一個控制器中會偵聽到修改後的值,並根據修改後的值,做出回應。

app.controller('versiontaskCtrl', function WriteTestcaseCtrl($scope, $cookies, $rootScope, $modal, $stateParams, ui, searchVariable, currentuserversions,) {
 $scope.taskId = $cookies['edit_taskId'];
 $scope.versionid = parseInt($cookies['edit_versionId']);
 $scope.versionName = $cookies['edit_versionName'];
 $scope.version = $scope.versionid;
 getuserversions = function () {
  currentuserversions.get(function (res) {
   $scope.versions = res;
  });
 };
 reload = function () {
  getuserversions();
 };
 $scope.changeVersionid = function (v) {
  console.log(v);
  $scope.$broadcast('versionidChange', $scope.versionid); //向其他控制器广播$scope.versionid值的变化。
 };
 reload();
});

第二個控制器中監聽第一個控制器中的廣播事件:

app.controller('SchemeTaskEditableRowCtrl', function ($scope, $rootScope, $cookies, $filter, $http, $window, $stateParams, basetasksService, schemetasksService, UserService) {
 $scope.taskId = $cookies['edit_taskId'];
 $scope.versionid = $cookies['edit_versionId'];
 $scope.version = $scope.versionid;
 var userid = $rootScope.user.userid;
 $scope.schemetask = [];
 $scope.basetask = [];
 $scope.result = [];
 $scope.$on('versionidChange', function (event, versionid) {
  $scope.versionid = versionid; //监听到$scope.versionid值的变化。然后调用 $scope.schemeTask()和$scope.getUsers()这两个方法
  $scope.schemeTask();
  $scope.getUsers();
 });
 $scope.schemeTask = function () {
  $scope.tasks = [];
  $scope.schemetask = [];
  schemetasksService.get({version: $scope.versionid}, function (res) {
   $scope.schemetask_collection = res.results;
   //console.log($scope.schemetask_collection);
   $scope.schemetask_displayed = [].concat($scope.schemetask_collection);
   var i = 1;
   angular.forEach($scope.schemetask_collection, function (item) {
    item['director'] = "app.writetestitem" + "({taskid:" + item.id + "})";
    item['number'] = i;
    i++;
    $scope.schemetask.push(item);
   });
   $scope.tasks = $scope.schemetask;
  });
 };
 $scope.getUsers = function () {
  UserService.get(function (res) {
   $scope.users = res.results;
   $scope.usersDisplayed = [].concat($scope.users);
   $scope.itemArray = [];
   $scope.userArray = [];
   $scope.names = [];
   angular.forEach($scope.users, function (item) {
    $scope.itemArray.push(item);
    $scope.userArray.push(item.name + item.number);
    var itemname = {'name': item.name, 'number': item.number};
    $scope.names.push(itemname);
   });
   $scope.selected = $scope.users;
  });
 };
});

#我相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

jQuery實作輸入文字超過規定行數時自動加入省略號

微信小程式分享頁面後跳轉回首頁

#

以上是Angularjs讓控制器之間相互通訊(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn