2015-04-06 144 views
0

你好,我有以下服務:

angular.module('vendor').service('ticketService', function() { 

    var ticketList = []; 
    var result = false; 

    var addToCart = function(type, ticket, tSI) { 
     var data = {} 

     if (type =='event') 
     { 
      data = { 
       type: type, 
       tSI: tSI 
      } 
     } 

     if (type =='bus') 
     { 
      data = { 
       type: type, 
       company: ticket.company, 
       date: ticket.when, 
       number: ticket.number || 1, 
       tSI: tSI 
      } 
     } 

     if (type == 'extra') 
     { 
      data = { 
       type: type, 
       extra: ticket, 
       tSI: tSI 
      } 
     } 

     $.ajax({ 
      type: "post", 
      url: '/cart', 
      headers: { 
       'X-XSRF-Token': $("meta[name='csrf_token']").attr("content") 
      }, 
      data: data, 
      dataType: 'json', 
      success: function (data) { 
       ticket.hasTicket = true; 
       result = 200; 
      } 
     }); 
    } 

    return { 
     addToCart: addToCart, 
     result: result 
    }; 

}); 

現在我把這種服務在我的控制器:

angular.module('vendor').controller('TicketController', ['$http', '$scope', '$rootScope', 'ticketService', '$timeout', function($http, $scope, $rootScope, ticketService, $timeout) { 
    $scope.addToCart = function(type, ticket, tSI, $index) { 
       $scope.selectedIndex = $index; 

       $scope.isWorking = true; 
       $scope.isReady = false; 

       ticketService.addToCart(type, ticket, tSI); 
       $rootScope.$broadcast('TICKET_ADDED', true); 

      }; 

      $scope.$watch('ticketService.result', function (newVal, oldVal) { 
       alert(ticketService.result); 
       if (typeof newVal !== 'undefined') { 
        if (ticketService.result == 200) { 
         $scope.isWorking = false; 
         $scope.isComplete = true; 
        } 
       } 
      }); 
}]); 

當票證加入我希望能夠爲了在這種情況下將結果返回給控制器200,我目前正在嘗試觀察ticketService.result的值,但是當函數完成時$ watch不會執行任何操作。

+0

你在控制檯得到任何錯誤。 Plz檢查一次 – Reena 2015-04-06 12:23:06

回答

0

更好地將ticketService.result分配給$scope屬性並收聽該屬性。使用$scope.result = ticketService.result

$scope.$watch('result', function (newVal, oldVal) { 
       alert(ticketService.result); 
       if (typeof newVal !== 'undefined') { 
        if (ticketService.result == 200) { 
         $scope.isWorking = false; 
         $scope.isComplete = true; 
        } 
       } 
      }); 

另一種選擇是,

而是在你的範圍內創造一個$watchemit事件從服務和listen給它的。

象下面這樣:

進樣$rootScope在您服務。

$.ajax({ 
      type: "post", 
      url: '/cart', 
      headers: { 
       'X-XSRF-Token': $("meta[name='csrf_token']").attr("content") 
      }, 
      data: data, 
      dataType: 'json', 
      success: function (data) { 
       ticket.hasTicket = true; 
       result = 200; 
       $rootScope.$emit("result-changed"); 
      } 
     }); 
在你的控制器

$scope.$on("result-changed", function(event, data) { 
    if (ticketService.result == 200) { 
      $scope.isWorking = false; 
      $scope.isComplete = true; 
    } 
}); 

這將減少$watch數量,您可以在您的應用程序擁有。只有在事件觸發時,控制器中的監聽器纔會觸發。

+0

我試過這個,但它沒有工作。 – user3718908 2015-04-06 12:43:21

+0

而不是原始'結果'你可以將它綁定到一個對象?像'ticketservice = {}'。 'ticketservice.result = false' – mohamedrias 2015-04-06 12:45:44

+0

手錶在頁面最初加載時工作,但當值改變時什麼都沒有發生,如果我做ticketService = {}它仍然沒有任何區別。我能理解爲什麼。 – user3718908 2015-04-06 12:58:46

0

嘗試觀看它返回tickectService.result值,而不是字符串的函數:

$scope.$watch(function() { return ticketService.result; }, function (newVal, oldVal) { 
      alert(ticketService.result); 
      if (typeof newVal !== 'undefined') { 
       if (ticketService.result == 200) { 
        $scope.isWorking = false; 
        $scope.isComplete = true; 
       } 
      } 
     }); 
+0

試過這個,但它沒有奏效。 – user3718908 2015-04-06 12:43:35