Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS和Javascript-减少样板代码_Javascript_Angularjs - Fatal编程技术网

AngularJS和Javascript-减少样板代码

AngularJS和Javascript-减少样板代码,javascript,angularjs,Javascript,Angularjs,我意识到这可能只是一个常规的javascript/异步编程查询,但AngularJS是我最希望看到减少常见任务样板的地方 在AngularJS控制器中,我通常有这些类型的模式,其中数据的实际加载和存储被委托给服务 $scope.user = null; $scope.init = function(){ // load user profileService.loadUser(function(user){ $scope.apply(function(){

我意识到这可能只是一个常规的javascript/异步编程查询,但AngularJS是我最希望看到减少常见任务样板的地方

在AngularJS控制器中,我通常有这些类型的模式,其中数据的实际加载和存储被委托给服务

$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),将其向下推一层似乎有点错误。