2015-10-18 87 views
0

我是AngularJS的新手。 我創建了一個服務來檢索使用$ http.get的文件,但我無法弄清楚 如何控制何時執行服務功能。AngularJS服務功能執行順序

我的控制器的功能是注入服務。

頁面第一次加載時,首先調用服務函數。 相反,我希望在單擊按鈕後調用服務功能。

或者我可能不應該使用服務功能?

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

 
app.controller("myCtrl", function($scope, $http, myService) { 
 
    
 
    $scope.searchValues = function() { 
 
     $scope.value = "search.json"; 
 
     myService.setValue($scope.value); 
 
     console.log(" in searchValues " + $scope.value); 
 
    }; 
 
}); 
 

 

 
app.service("myService", function($http, $q) { 
 
    var deferred = $q.defer(); 
 
    var value ; 
 

 
    this.setValue = function(valueSelected) { 
 
     console.log("in service: " + valueSelected); 
 
     value = valueSelected; 
 
    }; 
 

 
    $http.get('http://juubaker.github.io/' + value).then(function(data) { 
 
     console.log("in service 2: " + value); 
 
     deferred.resolve(data); 
 
    }); 
 

 

 
    this.getValue = function() { 
 
     return deferred.promise; 
 
    }; 
 
});

感謝

+0

請看'ng-click'或者它是否在'ng-submit'形式。無論哪種方式使用服務都是合適的,只需要在事件觸發函數中包裝'myService.setValue()'方法 – charlietfl

+0

感謝您的快速回復。實際上,在按鈕上,我使用ng-click並調用函數。但是,該服務在點擊按鈕之前已被調用。我不確定事件函數如何觸發服務函數調用。 – juubaker

+0

這就是初始化的正常方式。如果這沒有發生,你將在你的控制器中得到未知提供者myService錯誤 – MaheshKumar

回答

0

你的服務看起來完全正常。請不要立即在您的控制器中調用您的myService.setValue方法。相反,創建您通過ng-click

app.controller("myCtrl", function($scope, $http, myService) { 
    $scope.updateValue = function(){ 
    myService.setValue($scope.value); 
    } 
}); 

而且你的模板運行的方法:

<input type="text" ng-model="value" /> 
<a ng-click="updateValue()">Save Value</a> 

您的控制器方法中的邏輯是基於該控制器,這是初始化立即運行,爲什麼你正在運行進入這個問題。

+0

哦,很棒。好的,我將setValue移到了一個函數中。並且該服務在初始化時不被調用。但是,我的服務中也有一個http.get函數,它在初始化時仍然被調用。如果我無法解決此問題,我會再次檢查代碼併發布。 – juubaker

+0

來自上次評論的更正。在點擊按鈕之前,服務被調用了兩次。在最後一個建議之後,我將service.setValue調用移到了一個函數中。但是$ http.get在初始化時被調用。 – juubaker

+0

有沒有理由不把你的http請求放在你的'setValue'方法中? –