如何使AngularJS$资源在从多个控制器引用时返回同一实例?
我在同一个视图中组合了多个指令,所有指令都访问同一个资源。其中一个指令包含一个表单 我希望$resource返回一个单例,因此数据中的任何更改都会自动反映在所有其他指令中,但事实并非如此 请看一个例子。另请参见下面的代码:如何使AngularJS$资源在从多个控制器引用时返回同一实例?,angularjs,angularjs-service,angular-resource,Angularjs,Angularjs Service,Angular Resource,我在同一个视图中组合了多个指令,所有指令都访问同一个资源。其中一个指令包含一个表单 我希望$resource返回一个单例,因此数据中的任何更改都会自动反映在所有其他指令中,但事实并非如此 请看一个例子。另请参见下面的代码: angular .模块(“应用程序”、[“ngResource”]) .控制器(“c1”,功能($scope,res){ $scope.response=res.get(); }) .控制器(“c2”,功能($scope,res){ $scope.response=res.g
angular
.模块(“应用程序”、[“ngResource”])
.控制器(“c1”,功能($scope,res){
$scope.response=res.get();
})
.控制器(“c2”,功能($scope,res){
$scope.response=res.get();
})
.服务(“res”,功能($resource){
常量url=”https://httpbin.org/delay/1";
返回$resource(url{
get:{method:“get”},
保存:{method:“POST”}
});
});
c1:{{response.origin}}
c2:{response.origin}}
我希望输入框中的任何更改都会在两个视图中更新($scope.response应该指向同一个对象),但只会更改同一隔离范围下的一个
有没有一种方法可以在视图之间共享相同的$resource对象?一种方法是将$resource保存在服务中,并且只能通过服务方法访问它。看见您必须小心使用这种方法,因为每次调用singleton时都会使用传递的参数更新它。因此,在资源唯一的情况下,这非常有效
angular
.模块(“应用程序”、[“ngResource”])
.控制器(“c1”,功能($scope,srv){
$scope.srv=srv;
$scope.srv.get(“https://httpbin.org/delay/1");
})
.控制器(“c2”,功能($scope,srv){
$scope.srv=srv;
$scope.srv.get(“https://httpbin.org/delay/1");
})
.服务(“srv”,功能($resource){
让服务={};
service.get=url=>{
服务。$resource=$resource(url{
get:{method:“get”},
保存:{method:“POST”}
});
service.resource=service.$resource.get();
};
回程服务;
});
HTML:
c1:{{srv.resource.origin}
c2:{{srv.resource.origin}}
一种方法是将$resource保存在服务中,并且只通过服务方法访问它。看见您必须小心使用这种方法,因为每次调用singleton时都会使用传递的参数更新它。因此,在资源唯一的情况下,这非常有效
angular
.模块(“应用程序”、[“ngResource”])
.控制器(“c1”,功能($scope,srv){
$scope.srv=srv;
$scope.srv.get(“https://httpbin.org/delay/1");
})
.控制器(“c2”,功能($scope,srv){
$scope.srv=srv;
$scope.srv.get(“https://httpbin.org/delay/1");
})
.服务(“srv”,功能($resource){
让服务={};
service.get=url=>{
服务。$resource=$resource(url{
get:{method:“get”},
保存:{method:“POST”}
});
service.resource=service.$resource.get();
};
回程服务;
});
HTML:
c1:{{srv.resource.origin}
c2:{{srv.resource.origin}}
在控制器之间共享数据有几种方法。没有具体的“正确的方法”。共享对象方法的缺点是没有明确地通知订阅者对象的更改。框架必须监视对象的更改。Angular2+已经放弃了这种方法,因此任何依赖它的AngularJS代码都将难以迁移。@georgeawg感谢您的评论。严格来说,这不是事实。请参阅代码笔示例,其中跨控制器()更新共享服务。代码笔中的示例取决于模板中的观察者,并且不会通知控制器更新。我所说的缺点适用。在控制器之间共享数据有几种方法。没有具体的“正确的方法”。共享对象方法的缺点是没有明确地通知订阅者对象的更改。框架必须监视对象的更改。Angular2+已经放弃了这种方法,因此任何依赖它的AngularJS代码都将难以迁移。@georgeawg感谢您的评论。严格来说,这不是事实。请参阅代码笔示例,其中跨控制器()更新共享服务。代码笔中的示例取决于模板中的观察者,并且不会通知控制器更新。我所说的缺点适用。