如何在 Angularjs 中的交叉模块之间共享数据
how to share Data between cross modules in angularjs?
我有两个模块,分别是"uploadModule"和"graphModule",在同一页面中,uploadModule浏览数据并将其保存在服务(sharedDataObject)上,我想将这些数据量共享到另一个模块(graphModule)
var uploadModule = angular.module('uploadModule', ['ngRoute']);
uploadModule.config(function ($routeProvider) {
$routeProvider
.when('/',
{
controller: 'dataSetController',
templateUrl: 'view1.html'
})
.when('/view2',
{
controller: 'compineGraphsWithData',
templateUrl: 'view2.html'
})
.otherwise({redirectTo: '/'})
});
uploadModule.service('sharedDataObject', function () {
this.getDataObject= function () {
return this.dataObject;
};
this.setDataObject= function (value) {
this.dataObject = value;
};
});//this service to share Data Object between controlles(graphs)
uploadModule.controller('dataSetController', dataSetController);//load data set and but it on sharedDataObject service
function dataSetController($scope, sharedDataObject) {
$scope.datasetfile;
var file;
$scope.getDataSetFile = function (files) {
file = files[0];
$scope.datasetfile = file.name;
var reader = new FileReader();
reader.onload = function (evt) {
var result = evt.target.result;
var Json;
Json = CSV2JSON(result);
dataset = JSON.parse(Json);
sharedDataObject.setDataObject(dataset);
console.log(dataset);
};
reader.readAsText(file);
$scope.$apply();
};
}
;
var graphModule = angular.module("graphModule", ['uploadModule']);
graphModule.controller('createGraph', createGraph);
function createGraph($scope ,sharedDataObject ) {
$scope.Scatter = function () {
console.log(sharedDataObject.getDataobject());
};
}
;//compineGraphsWithData and fire graph function
angular.bootstrap(document.getElementById("App2"),['graphModule']);
<input type="file" id="dataset" name='file' onchange="angular.element(this).scope().getDataSetFile(this.files)" />
函数名称似乎不正确:
console.log(sharedDataObject.getDataobject());
它应该是:
console.log(sharedDataObject.getDataObject());
编辑:我不知道,对我来说一切似乎都很好。Angularjs服务可用于在控制器之间共享数据,即使它们属于不同的模块。由于我不知道您的完整脚本,因此我根据您的示例代码制作了一个示例。是这样的:
<html><head>
<style>
</style>
</head>
<body>
<div ng-app="graphModule">
<div ng-controller="dataSetController">
<input type="file" id="dataset" name="file" onchange="angular.element(this).scope().getDataSetFile(this.files)">
</div>
<div ng-controller="createGraph">
<button ng-click="Scatter()">Click me</button>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script>
var uploadModule = angular.module('uploadModule', []);
uploadModule.service('sharedDataObject', function () {
this.getDataObject = function () {
return this.dataObject;
};
this.setDataObject = function (value) {
this.dataObject = value;
};
});//this service to share Data Object between controlles(graphs)
uploadModule.controller('dataSetController', dataSetController);//load data set and but it on sharedDataObject service
function dataSetController($scope, sharedDataObject) {
$scope.datasetfile;
var file;
$scope.getDataSetFile = function (files) {
file = files[0];
$scope.datasetfile = file.name;
var reader = new FileReader();
reader.onload = function (evt) {
var result = evt.target.result;
var Json;
//Json = CSV2JSON(result);
Json = result;
//dataset = JSON.parse(Json);
dataset = Json;
sharedDataObject.setDataObject(dataset);
console.log(dataset);
};
reader.readAsText(file);
$scope.$apply();
};
}
;
var graphModule = angular.module("graphModule", ['uploadModule']);
graphModule.controller('createGraph', createGraph);
function createGraph($scope, sharedDataObject) {
$scope.Scatter = function () {
console.log(sharedDataObject.getDataObject());
};
}
;//compineGraphsWithData and fire graph function
// angular.bootstrap(document.getElementById("App2"),['graphModule']);
</script>
</body></html>
使用服务在控制器之间共享数据的方式遵循以下模式:http://embed.plnkr.co/ohkXfy/preview
var myApp = angular.module('myApp', []);
myApp.service('sharedModels', [function () {
'use strict';
// Shared Models
this.data = {breakfast: 'eggs'};
}]);
myApp.controller('Ctrl1', ['$scope', 'sharedModels', function($scope, sharedModels) {
$scope.myBreakfast = sharedModels.data;
}]);
myApp.controller('Ctrl2', ['$scope', 'sharedModels', function($scope, sharedModels) {
$scope.yourBreakfast = sharedModels.data
}]);
myApp.controller('Ctrl3', ['$scope', 'sharedModels', function($scope, sharedModels) {
$scope.ourBreakfast = sharedModels.data;
}]);`
您应该将公共状态提取到它自己的模块中,并将其作为依赖项添加到两个模块中。然后,您可以在两个模块中访问相同的共享状态。
编辑:我在Plunker中举了一个例子。
因此,您创建一个模块,其中包含两个模块所需的服务:
(function(){
angular.module("sharedData", [])
.service("sharedService", function(){
this.getSharedData = function(){
return this.sharedObject;
};
this.setSharedData = function(newData){
this.sharedObject = newData;
};
});
}());
然后,使此模块成为需要它的模块的依赖项:
(function(){
angular.module("firstModule", ["sharedData"])
.controller("firstCtrl", function($scope, sharedService){
$scope.get = function(){
$scope.data = sharedService.getSharedData();
};
});
}());
(function(){
angular.module("secondModule", ["sharedData"])
.controller("secondCtrl", function($scope, sharedService){
$scope.set = function(){
sharedService.setSharedData("Test");
};
});
}());
如果您有更多问题,请提前询问。
相关文章:
- 如何在 Angularjs 中的交叉模块之间共享数据
- 角度控制器名称在模块之间冲突
- 网络应用程序:模块之间相互交流
- 如何在模块之间共享对象
- RequireJS:如何在模块之间传递更新的数据
- 角度依赖注入,使用服务在模块之间传递值
- 如何在模块之间更新此变量的值
- 在模块之间传递对象引用
- 在模块之间传递值
- 在模块之间共享的事件发射器
- 如何在 AngularJS 中的两个独立模块之间共享数据
- 奇怪的壁虎行为(试图在js模块之间传递一个nsiDomWindows数组)
- Angular - 如何在模块之间共享控制器
- 如何在javascript模块之间进行通信
- 减少RequireJS模块之间的代码重复
- 如何在requirejs、javascript中的不同模块之间共享数据
- 寻找在模块之间导出和导入变量的最佳方式
- 什么'这是允许一个节点进程在其自己的模块之间进行通信的最具规模友好的方式
- PubSub模式用于在两个解耦的javascript模块之间传输数据
- 如何在两个模块之间传递事件数据