2014-03-12 64 views
0

我現在的控制器都充滿了隱藏的提交按鈕邏輯,並經過後端獲取的數據顯示成功消息:AngularJS - 如何在多個控制器中共享監視對象?

angular.module('testApp').controller('TestCtrl', ['$scope', 'testService', 
    function ($scope, testService) { 

    $scope.loading = false; 
    $scope.updated = false; 
    $scope.error = false; 

    $scope.submit = function() { 
     if(!$scope.form.$valid) { 
     return; 
     } 

     $scope.loading = true; 
     testService.doBackendUpdate({some:'data'}) 
     .success(function() { 
      $scope.error = $scope.loading = false; 
      $scope.updated = true; 
     }) 
     .error(function(error) { 
      $scope.updated = $scope.loading = false; 
      $scope.error = true; 
     }); 
    }; 
    }]); 

和HTML:

<alert type="'success'" close="updated = false" ng-show="updated">Data Updated!</alert> 

<button ng-hide="loading">update</button> 

什麼,我想有這些,而不是變量是某種對象,並再次使用 其他控制:

angular.module('testApp').controller('TestCtrl', ['$scope', 'testService', 
    function ($scope, testService) { 

    $scope.status = new ActionStatus(); 

    $scope.submit = function() { 
     if(!$scope.form.$valid) { 
     return; 
     } 

     $scope.status.loading(); 
     testService.doBackendUpdate({some:'data'}) 
     .success(function() { 
      $scope.status.succes(); 
     }) 
     .error(function(error) { 
      $scope.status.error(); 
     }); 
    }; 
    }]); 

和HTML:

<alert type="'success'" close="updated = false" ng-show="status.isUpdated">Data Updated!</alert> 

<button ng-hide="statuss.isLoading">update</button> 

但我怎麼能做到這一點? AngularJS手錶在觀察變量時丟失了上下文,所以我不能通過原型創建一個ActionStatus對象。

任何想法?

+0

它解壓到[**服務**](http://docs.angularjs.org/guide/services)?例如'.controller('TestCtrl',['$ scope','testService','ActionStatus',function($ scope,testService,ActionStatus){$ scope.status = ActionStatus; ...' –

+0

但是服務是單身人士。如果我在同一頁面上有兩個控制器...? – gerasalus

回答

0

有三種方式我能想到的:

  1. 把它放進$rootScope
  2. 將其放入服務/工廠,並使用消息系統($broadcast,$emit,$on)相互通信。
  3. 到第二個選項類似,只是objectEquality集觀看的維修服務爲true,像這樣:

    $watch(WhateverService.get(), functiondoTheJob(){...}, true) 
    
3

到幾個控制器之間共享的對象,你應該創建一個服務。

例子:

// Custom object 
function ActionStatus() { 
    this.isLoading = false; 
    this.updated = false; 
    this.error = false; 
    this.loading = function() {}; 

} 

angular.module('testApp').service('actionStatus', [ActionStatus]); 

// Inject object factory dependency to your controller. 
angular.module('testApp').controller('TestCtrl', ['$scope', 'testService', 'actionStatus', 
function ($scope, testService, actionStatus) { 

$scope.status = actionStatus; 

}]); 

這裏的問題是,服務是單身,並與new關鍵字進行實例化。

要共享對象原型並自己處理實例,可以使用工廠方法。工廠應退回原型的構造是這樣的:

app.factory('actionStatus', [function() { 

// Define constructor 
function ActionStatus() { 
    this.isLoading = false; 
    this.updated = false; 
    this.error = false; 
    this.loading = function() {}; 
    this.stopLoading = function() { 
    this.isLoading = false; 
    }; 
} 

// Return constructor to handle the instantiation yourself. 
return ActionStatus; 
}]); 

我創建了plnkr工作示例給你:http://plnkr.co/edit/Wd4kmg?p=preview

更多信息是:

http://code.angularjs.org/1.2.14/docs/guide/providers

+0

如果我在同一頁面上有控制器,該怎麼辦?服務是單身人士, – gerasalus

+0

這是一個單身人士,這正是你想要的,兩個控制器都可以訪問相同的單身人士,它可以讓你分享數據。 – hassassin

+0

我不想分享它們,我想重新使用它們作爲新對象,這就是爲什麼我說不能使用原型 – gerasalus

相關問題