2015-10-27 33 views
1

這是我第一次嘗試在AngularJS中編寫一個服務。我有一個服務,我有一個功能。當我從我的控制器調用該服務時,它說XXXService.XXXfunction不是一個函數。angularjs XXXService.XXXfunction不是函數

我的JavaScript是什麼樣子,

var sharecycle0_angularfire = angular.module("sharecycle0_angularfire", []); 

sharecycle0_angularfire.service("baseHttp", function($http, $q){ 


    self.getFire = function(){ 

     var deferred = $q.defer(); 

     $http({ 
     method: GET, 
     url: "https://boiling-inferno-1234.firebaseio.com/Cat" 
     }).then(function(response){ 
     deferred.resolve(response); 
     },function(response){ 
     deferred.reject(resposne); 
    }); 

    return deferred.promise; 

    }; 

}); 

sharecycle0_angularfire.controller("angularfirecontroller", function($scope, baseHttp, $window){ 

    $scope.fireClick = function(){ 

     baseHttp.getFire() 
     .then(
      function(response) 
      { 
       $("<div/>").text(response).appendTo($("#successData")); 
      }, 
      function(response) 
      { 
       $window.alert("error: "+response); 
      } 
    ); 

    }; 

}); 

我的HTML是什麼樣子,

<body ng-controller="angularfirecontroller"> 
    <button id="fireClickButton" ng-click="fireClick()">fireClick</button> 
    <div id="successData"/> 
</body> 

我所期望的服務代碼,在我的按鈕被擊中運行。

+0

你有去無回'getFire',那麼你的'baseHttp.getFire()'不會有任何效果。 –

回答

1

你有一些問題,在這裏,你是不是該函數getFire連接到服務實例,而是要將它連接到全局變量self。全局變量通常是許多瀏覽器中窗口對象的別名,因此您將該函數附加到窗口而不是控制器實例。由於http已經返回承諾,因此您不需要在那裏創建延遲對象,而只需返回$http的結果。除此之外,GET需要是字符串值,您正嘗試使用未定義的變量GET而不是"GET"。很多時候在代碼的相關區域放置調試日誌將幫助您診斷問題。

所有你需要的是:

sharecycle0_angularfire.service("baseHttp", function($http, $q){ 
    this.getFire = function(){ 
     return $http({ 
     method: 'GET', 
     url: "https://boiling-inferno-1234.firebaseio.com/Cat" 
     }); 
    } 
}); 

,如果你打算緩存this,那麼你應該創建一個局部變量並分配this了這一點。

sharecycle0_angularfire.service("baseHttp", function($http, $q){ 
    var _this = this; //Or var self = this 
    _this.getFire = function(){ 
     return $http({ 
     method: 'GET', 
     url: "https://boiling-inferno-1234.firebaseio.com/Cat" 
     }); 
    } 
}); 
+0

謝謝。這樣可行。 – Bigman

+0

@Bigman不客氣.. :) – PSL