我有一个混合角应用程序,它同时使用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
});
事件的能力。
有什么建议吗?
答案 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) {}