2015-10-18 52 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'方法中? –