2015-01-02 46 views
2

我有2個控制器不在同一個範圍內或有一個父子關係。如何從服務調用控制器功能?

所以我想從controlleB調用ControllerA中的一個函數。在我的情況下,它是一個帶有addItem函數的listContoller,我想在單擊提交後從頁面上其他位置的addItemController調用此函數。我知道這應該與服務,但我不知道如何。

app.controller("listCtrl", ["$scope", "listSvc", function ($scope, listSvc){ 
    $scope.list.data = listSvc.load("category"); 
    $scope.addItem = function(newitem) { 
     $scope.list.data.unshift(newitem); 
     ... 
    } 
}]); 

app.controller("addItemCrtl", ["$scope", "listSvc", function ($scope, listSvc){ 
    $scope.addItem = function() { 
     listSvc.addItem($scope.newItem); 
    } 
}]); 

app.service('listSvc', function() { 
    return{ 
     load: function(section){ 
      ... 
     }, 
     addItem: function(item){ 
      addItem(item); <<-- call function in listController 
     } 
    } 
}); 

UPDATE

k是這更好的?我把list.data放在我的服務裏面,如果列表發生變化,並且把它放在我的控制器的範圍內,那麼ng-repeat可以完成他的工作......我的控制器更好嗎?或有更好的人提示我應該怎麼做呢?

app.service('listSvc', ['$http', function($http) { 
    var list = {}; 
    return {  
     list:{ 
      get: function() { 
       return list.data; 
      }, 
      set: function (data) { 
       list.data = data; 
      }   
     }, 
     addItem: function(item){ 
      var response = $http.post("/api/album/"+$scope.list.section, item); 
      response.success(function(){ 
       list.data.unshift(item); 
       console.log("yeah success added item"); 
      }).error(function(){ 
       console.log("buuuh something went wrong"); 
      }); 
      return response; 
     }, 

     load: function(section){ 
      var response = $http.get("/api/album/"+section); 
      response.success(function(data){ 
       list.set(data); 
       list.section = section; 
       console.log("yeah success loaded list"); 
      }).error(function(){ 
       console.log("buuuh something went wrong"); 
      }); 
      return response; 
     } 
    }; 
}]); 

,並在我的控制器,我這樣做

app.controller("listCrtl", ["$scope", "listSvc", function ($scope, listSvc){ 
    listSvc.load("category"); 
    ... 
    $scope.$watch('listSvc.list.get()', function(data) { 
     $scope.list.data = data; 
    }); 
    ... 
}]); 


app.controller("addItemCrtl", ["$scope", "listSvc", function ($scope, listSvc){ 
    ... 
    $scope.addItem = function() { 
     listSvc.addItem($scope.newItem); 
    } 
    ... 
}]); 

格雷戈爾;)

+0

你不能在服務中包含$ scope。那麼你怎麼能想到從服務中調用一個函數呢.. – Ved

+1

不要!這是糟糕的設計。 – pixelbits

+0

是的,這是真的:)所以這個問題應該如何解決?我是否應該將我的控制器中的所有邏輯放入我的服務中? –

回答

0

我只是解決了這個嘍!或許,這可以幫助:

控制器的內部功能:

var timeoutMsg = function() { 
    vm.$parent.notification = false; 
}; 

服務內的功能(我曾在$超時傳遞以及從函數的名稱我控制器,現在它的工作原理):

// original broken code: 
// this.modalSend = function(vm) { 

// fixed: 
this.modalSend = function(vm, $timeout, timeoutMsg) { 

    vm.$parent.sendTransaction = function() { 

     // Show notification 
     vm.$parent.message = 'Transaction sent!'; 
     vm.$parent.notification = true; 
     $timeout(timeoutMsg, 4000); 

     // original broken code: 
     // $timeout(timeoutMsg(), 4000); 
    }; 
} 

var vm = $scope

相關問題