我是Angularjs的新手。我对控制器的设计和数据共享有疑问。
我有第一个部分upload.html
使用UploadCntrl
使用$http.post
将word文档上传到服务器。服务器调用封装在uploadService
中。在服务器端,我会调整文档中单词列表出现的频率,并将该信息作为对$http.post
的响应返回。
回到UploadCntrl
,成功后,我想指示/显示第二个部分report.html,它使用AnalyseCntrl
来显示分析的响应(上面提到的$http.post
)表格形式。
如何与UploadCntrl
一起分享AnalyseCntrl
中的分析响应?
这是设计控制器的正确方法吗?
答案 0 :(得分:0)
执行此操作的方法是创建服务并将其注入两个控制器。
app.service("sharedService", function () {
return {
sharedObject: {data: null}
};
});
现在在每个控制器中,像这样:
app.controller("myController", ["$scope", "$http", "$filter", "storageService", function($scope, $http, $filter, storageService) {
// We don't need to put it on the $scope but it makes it available to the view
$scope.shared = storageService.sharedObject;
...
// After the following line, the other controller will have access to
// storageService.sharedObject.myThing as well. Easy!
$scope.shared.myThing = "your thing";
...
答案 1 :(得分:0)
最好通过services或factories在AngularJS中共享数据。另一种选择是将响应存储在浏览器的local storage
内,然后在AnalyseCntrl
内访问它。
所以,在UploadCntrl
:
anaylseAPI.sendToAnalyse(object).then( function (response) {
localStorage.setItem("howMany", response.amount);
});
然后访问localStorage
内的AnaylseCntrl
。
另一种解决方案是使用服务。
它们的行为类似于单身人士,因此您可以将它们用作数据存储。
angular
.module( 'app', [])
.service('DataStore', DataStore);
function DataStore() {
this.amount = 0;
return function(amountOf) {
this.amount = amountOf;
};
}
现在inject
两个控制器中的服务,并保存/获取数据。
答案 2 :(得分:0)
您可以编写一个负责发送您的帖子请求的angularjs服务。在此服务中,您可以使用变量存储响应,并提供getter方法来检索此变量的值。
此外,您可能希望提供一个功能,将您的文件作为参数并发出$http
请求。只要收到服务器的响应,就会将响应值分配给变量并发送广播。
广播可以是这样的
$rootScope.$broadcast('response-recieved');
您需要做的是在两个控制器中注入此服务,收听广播事件,然后调用服务的get方法来检索响应。
你可以这样做:
$scope.$on('response-recieved', function() {
var myResponse = MyService.getResponse();
}
Here您可以找到如何使用服务的示例。如果这有助于你,请告诉我。