AngularJs - 向单个控制器广播事件

时间:2014-10-28 15:29:10

标签: javascript angularjs forms typescript

我有一个页面,其中列出了每个可以执行某些操作的潜在客户。每个操作都是一个表单,因此可以在同一页面上多次显示相同的表单。

每个表单都有自己的范围和它自己的控制器实例。提交表单时,我调用服务来执行ajax操作,完成后我广播一条消息,然后在控制器中我收听消息。问题是因为表单的每个实例都有自己的控制器实例,每个表单都会触发偶数监听器。我怎样才能为活动控制器调用它?这是一些样本代码:

服务:

/**
    * Delegate downline submit
    */
    delegatedDownlineSubmit(delegateDownLineModel: IDelegateDownLineModel) {
        this.PostJson('/api/Lead/DelegateDownLine', delegateDownLineModel)
            .success(function (response: IAjaxResponse) {
                if (response !== null) {
                    LeadServices.rootScope.$broadcast('LeadService.DelegatedDownlineSubmitted', response);
                }
            });
    }

Controller - 为每个表单实例调用一次:

delegateDownLineFormScope.$on('LeadService.DelegatedDownlineSubmitted', function (event: ng.IAngularEvent, ajaxResponse: IAjaxResponse) {
            //Do stuff
        });

我也试过只在范围内调用广播:

LeadServices.rootScope.BroadcastToElement('#Lead_123 form[name=DelegateDownLineForm]', 'LeadService.DelegatedDownlineSubmitted', response);

    /**
     * Broadcast a message to another element on the page
     */
    scope.BroadcastToElement = function (selector: any, message: string, ...args: any[]) {
        var broadcastArgs = [message];
        if (args) {
            broadcastArgs = broadcastArgs.concat(args);
        }

        return angular.element(selector).scope().$broadcast.apply(this, broadcastArgs);
    };

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

基于

  

每个表单都有自己的范围和它自己的控制器实例。

  

我怎样才能为活动控制器调用它

解决方案

您如何确定active controller?如果像active = true这样的东西只是在偶数监听器中使用它:

delegateDownLineFormScope.$on('LeadService.DelegatedDownlineSubmitted',  (event: ng.IAngularEvent, ajaxResponse: IAjaxResponse)  => {
            if(this.active){
            //Do stuff
            }
        });

另请注意,我使用的是箭头(=>)功能。