使用 TypeScript 在 AngularJS 中的指令之间共享来自异步调用的数据
Sharing data from asynchronous calls amongst directives in AngularJS with TypeScript
我可以找到解决这个问题的零碎信息,但没有具体的方法让它发挥作用。
我对服务器进行异步调用以获取 AngularJS 中的数据并希望将其存储在变量中。这个变量然后需要应用程序中的所有指令都可以访问,但显然它们都需要等待变量被分配才能使用它。我还使用 TypeScript 及其 export
功能从它们自己的函数中旋转指令。
控制器
export class MainController{
fundData: Object;
constructor(scope, FundService) {
FundService.fetchData('some_param').then(d => {
let data = d[0],
fundProps = data.properties_pub;
this.fundData = {
'isin': data.clientCode,
'nav': fundProps.nav.value,
'nav_change': fundProps.nav_change.value.toFixed(2),
'nav_change_direction': change,
'total_aum': fundProps.net_asset.value.toFixed(2)
};
scope.ctrl = this;
});
}
}
指令
class OverviewController {
scope: ng.IScope;
constructor(scope){
scope.$watch('data', newVal => {
console.log(newVal);
});
}
}
OverviewController.$inject = ['$scope'];
export function overview(): ng.IDirective {
return {
restrict : "C",
controller : OverviewController,
controllerAs : "overview",
template : require("../templates/overview"),
bindToController :{
data: '='
}
}
}
HTML
<div ng-controller="MainController">
<div class="overview" data="ctrl.fundData"></div>
</div>
Bootstrap 进程
let module = angular.module(MODULE_NAME,[])
.controller('MainController', ['$scope','FundService', MainController])
.service('FundService', FundService)
.directive('overview', overview);
我尝试过的事情:
$rootScope
我可以设置一些静态的东西并分享它,这样就可以了:
$rootScope.data = 2;
这不是:
someFunction().then(data => { $rootScope.data = data });
也许我不明白 $rootScope 中的承诺。
在控制器中设置
我可以将调用的结果设置为控制器中的一个变量,将其设置为指令中的一个属性,然后将该属性绑定到它的控制器,但这也不起作用,即使我使用$watch
在变量上。
我会做的是获取数据,将其存储在服务中(我认为您已经在做),然后在服务中的数据更新时广播一个事件。这是一个示例(原始 javascript)
module.service('DataService', function(rootScope) {
...
var data;
services.setData = function(newData) {
data = newData;
rootScope.$broadcast('DataUpdated');
};
...
});
然后在您的指令中,您需要做的就是监听 'DataUpdated'
事件:
scope.$on('DataUpdated', ...);
希望对您有所帮助!
我可以找到解决这个问题的零碎信息,但没有具体的方法让它发挥作用。
我对服务器进行异步调用以获取 AngularJS 中的数据并希望将其存储在变量中。这个变量然后需要应用程序中的所有指令都可以访问,但显然它们都需要等待变量被分配才能使用它。我还使用 TypeScript 及其 export
功能从它们自己的函数中旋转指令。
控制器
export class MainController{
fundData: Object;
constructor(scope, FundService) {
FundService.fetchData('some_param').then(d => {
let data = d[0],
fundProps = data.properties_pub;
this.fundData = {
'isin': data.clientCode,
'nav': fundProps.nav.value,
'nav_change': fundProps.nav_change.value.toFixed(2),
'nav_change_direction': change,
'total_aum': fundProps.net_asset.value.toFixed(2)
};
scope.ctrl = this;
});
}
}
指令
class OverviewController {
scope: ng.IScope;
constructor(scope){
scope.$watch('data', newVal => {
console.log(newVal);
});
}
}
OverviewController.$inject = ['$scope'];
export function overview(): ng.IDirective {
return {
restrict : "C",
controller : OverviewController,
controllerAs : "overview",
template : require("../templates/overview"),
bindToController :{
data: '='
}
}
}
HTML
<div ng-controller="MainController">
<div class="overview" data="ctrl.fundData"></div>
</div>
Bootstrap 进程
let module = angular.module(MODULE_NAME,[])
.controller('MainController', ['$scope','FundService', MainController])
.service('FundService', FundService)
.directive('overview', overview);
我尝试过的事情:
$rootScope
我可以设置一些静态的东西并分享它,这样就可以了:
$rootScope.data = 2;
这不是:
someFunction().then(data => { $rootScope.data = data });
也许我不明白 $rootScope 中的承诺。
在控制器中设置
我可以将调用的结果设置为控制器中的一个变量,将其设置为指令中的一个属性,然后将该属性绑定到它的控制器,但这也不起作用,即使我使用$watch
在变量上。
我会做的是获取数据,将其存储在服务中(我认为您已经在做),然后在服务中的数据更新时广播一个事件。这是一个示例(原始 javascript)
module.service('DataService', function(rootScope) {
...
var data;
services.setData = function(newData) {
data = newData;
rootScope.$broadcast('DataUpdated');
};
...
});
然后在您的指令中,您需要做的就是监听 'DataUpdated'
事件:
scope.$on('DataUpdated', ...);
希望对您有所帮助!