AngularJS和Javascript-减少样板代码
我意识到这可能只是一个常规的javascript/异步编程查询,但AngularJS是我最希望看到减少常见任务样板的地方 在AngularJS控制器中,我通常有这些类型的模式,其中数据的实际加载和存储被委托给服务AngularJS和Javascript-减少样板代码,javascript,angularjs,Javascript,Angularjs,我意识到这可能只是一个常规的javascript/异步编程查询,但AngularJS是我最希望看到减少常见任务样板的地方 在AngularJS控制器中,我通常有这些类型的模式,其中数据的实际加载和存储被委托给服务 $scope.user = null; $scope.init = function(){ // load user profileService.loadUser(function(user){ $scope.apply(function(){
$scope.user = null;
$scope.init = function(){
// load user
profileService.loadUser(function(user){
$scope.apply(function(){
$scope.user = user;
});
});
};
这是一个相当冗长的“getter”。
是否有更好的模式将数据从服务获取到作用域中?在您的服务中,如果您正在执行
$http.get
(或任何其他动词),它将返回未来的对象。未来对象是一个当前是承诺的对象,但最终将是一个对象
app.factory('profileService', function(){
return {
loadUser: function(){
return $http.get('http://www.example.com');
}
};
});
这将返回一个未来对象。因此,在代码中,您可以执行以下操作:
$scope.init = function(){
$scope.user = profileService.loadUser();
//no $scope.$apply necessary, as you are still inside a digest cycle.
};
短期内,$scope.user
将成为未来的对象。但它最终会分解成一个对象
app.factory('profileService', function(){
return {
loadUser: function(){
return $http.get('http://www.example.com');
}
};
});
要了解更多信息,请查看以下内容并查找未来的对象 据我所知,ajax请求将自动触发摘要,这样做
$scope.user=user
应该足够了吗?从我在类似主题的其他答案中所读到的内容来看,最好的方法是让您的服务/工厂返回一个承诺,将http请求设置缓存为true
,以减少重复的请求。这是一个很好的例子请注意,我没有透露服务中发生了什么。但是当然,如果服务调用回调作为$q的一部分,那么()将被消化为yes。但尽管如此,我经常有使用本地存储转储公共对象的缓存。它们没有加载隐式摘要。在这种情况下,我必须将当前作用域推送到服务中,以便它代表控制器应用$apply。不better@RobShepherd您是否可以像使用$一样,对服务中的摘要进行排队。get
会吗?您好@plalx,我是否需要将$scope传递给服务?例如,myService.doSomething(arg1,arg2,$scope),将其向下推一层似乎有点错误。