【问题标题】:Sharing data from asynchronous calls amongst directives in AngularJS with TypeScript使用 TypeScript 在 AngularJS 中的指令之间共享来自异步调用的数据
【发布时间】:2016-06-24 21:49:29
【问题描述】:

我可以找到解决这个问题的一些方法,但没有具体的方法让它起作用。

我有一个异步调用服务器以在 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>

引导过程

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 中的承诺。

在控制器中设置

我可以将调用结果设置为控制器中的变量,将其设置为指令中的属性,然后将属性绑定到其控制器,但这也不起作用,即使我使用@987654328 @ 变量。

【问题讨论】:

    标签: javascript angularjs asynchronous typescript angular-promise


    【解决方案1】:

    我要做的是获取数据,将其存储在服务中(我认为您已经这样做了),然后在服务中的数据更新时广播一个事件。这是一个示例(在原始 javascript 中)

    module.service('DataService', function(rootScope) {
        ...
        var data;
        services.setData = function(newData) {
            data = newData;
            rootScope.$broadcast('DataUpdated');
        };
        ...
    });
    

    然后在你的指令中你需要做的就是监听'DataUpdated'事件:

    scope.$on('DataUpdated', ...);
    

    希望有帮助!

    【讨论】:

    • @PankajParkar 在此处使用rootScope 以确保广播的事件被预期的子范围接收
    • @Robin 那么我将如何访问newData 呢? (对不起,我对 Angular 的了解不是很好)
    • @Robin 编辑:我将newData 分配给$rootScope,这很有效!不知道这是否是一个好习惯?无论如何,非常感谢
    • @Robin 我的观点是为什么不共享服务直接获取和设置数据,而不是让它基于事件
    • @PankajParkar 由于异步调用,它需要基于事件。由于性能问题,服务无法调用每个指令
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多