调用$ emit事件从angular到angularJS(发布 - 订阅模式)

时间:2018-06-14 17:04:25

标签: angularjs angular angular-hybrid

我有一个混合角应用程序,它同时使用angularJS和angular.5。

我正在将控制器从angularJS迁移到角度5.此控制器(让我们调用controller1)具有以下代码:

 $scope.status=(response.lCode.status=='A'?'Activate':'Inactivate');

然后,我有另一个订阅$rootScope.$emit('goToHomeEvent', 'Navigate to HomePage'); 的控制器(让我们调用controller2):

goToHomeEvent

我的目标是只将controller1迁移到角度5,保留controller2的代码,保持订阅 $rootScope.$on('goToHomeEvent', function (event, data) { //Do some stuff }); 事件的能力。

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

我认为你可能会使用localStorage,因为他们之间并没有真正的沟通。

我建议你在emit上填充localStorage并在controller2中观察它。它可能会起作用,虽然我不知道它是否是解决问题的最佳方法。

答案 1 :(得分:0)

我提出的解决方案是创建全局函数并将它们与窗口变量相关联,如下所示:

控制器1:

$rootScope.$emit('goToHomeEvent', 'Navigate to HomePage');
window.goToHomeEvent(data);

controller2(角度2 +):

window["goToHomeEvent"] = fuction(data) {
    //do stuff here
}

答案 2 :(得分:0)

我们的解决方案是全球的变种。在调用.module('app').run(fn)的顶层angularJS文件中,我们注入$rootScope$q$injector$state并将它们设置为全局变量{ {1}}(而不是直接放在窗口对象上)。所以Angular2 +调用app等。

app.$rootscope.实际上是浏览器的本机/ polyfilled app.$q及其相关功能,因此$ q的替换不需要注入较新的代码。

Promise.resolve仅适用于路由器问题。一旦你切换到Angular2的路由器,重新实现你在新路由器方面实际使用的$ state部分。

app.$state对很多奇怪的情况很有用。

答案 3 :(得分:0)

我已经通过全局功能解决了,而没有发出/广播:

AngularJS:

$window.bridgeFormAngular = function (params)
  {
    console.log(params);
  }

角度7:

public sendToAngularJS(params: Object)
  {
    window["bridgeFormAngular"](params);
  }

答案 4 :(得分:0)

您可以升级angularjs的$ rootscope并将其在混合对象的Angular侧面使用。​​

您将必须执行以下步骤:
1-将'$ rootScope'服务注册为Angular中的提供者:

@NgModule({
  providers: [{
    provide: '$rootScope',
    useFactory: ($injector: any) => $injector.get('$rootScope'),
    deps: ['$injector']
  }]
})

2-通过注入在Angular组件或服务中使用$ rootScope:

constructor(@Inject('$ rootScope')private _rootScope:any){}

constructor(@Inject('$rootScope') private _rootScope: any) {}