我正在渲染器进程中构建一个角度为 2 的电子应用程序。我的主要进程与套接字服务器通信。每当用户连接到此服务器或断开连接时,我希望在视图中显示用户的状态。
为此,我使用电子的 ipc 将消息从主进程发送到渲染器进程,如下所示
socket.on('connect', function() {
mainWindow.webContents.send('socket-connection-status', true);
});
socket.on('disconnect', function() {
mainWindow.webContents.send('socket-connection-status', false);
});
在我看来,然后我有一个(简化的)角度分量,像这样
const ipc = require('electron').ipcRenderer;
@Component({
selector: 'status-bar',
template: '{{status}}'
})
export class StatusBarComponent {
private status: string = "offline";
constructor() {
ipc.on('socket-connection-status', function(event, status) {
if (status===true) {
this.status = 'online';
} else {
this.status = 'offline';
}
console.log(status); // Successfully logs true|false
console.log(this.status); // Successfully logs online|offline
})
}
}
我成功地记录了来自主进程的消息。
问题是 angular 2 不“知道”电子的 ipc,因此不会触发变化检测status
。我见过几个人在这个问题上苦苦挣扎,但还没有找到一个“真正的”解决方案。
我尝试通过注入和(参考:手动触发 Angular2 更改检测)来解决它ApplicationRef
,但是所ChangeDetectorRef
提供的方法(分别为, )都没有提供解决方案。ngZone
tick()
detectChanges()
run()
显然,ipc.on
当我遇到错误时,“在”内我无法引用我的类的属性/方法/可注射:例如,这个(https://github.com/JGantner/angular2_change_detection_issue/blob/master/browser/security-level-indicator -component.ts)解决方案(我觉得不是很优雅)导致Uncaught TypeError: Cannot read property 'markForCheck' of undefined
.
有人可以帮我解决如何在我的情况下进行变更检测吗?
编辑(黑客):
我找到了一种至少获得我需要/想要的功能的方法:
status-bar.component.ts
:
const ipc = require('electron').ipcRenderer;
import { SocketStatusService } from '../services/socket-status.service';
@Component({
selector: 'status-bar',
template: '{{status}}'
})
export class StatusBarComponent {
private status: string = "offline";
status$: Subscription;
constructor(private socketStatusService: SocketStatusService, private ref: ApplicationRef) {
ipc.on('socket-connection-status', function(evt, status) {
if (status===true) {
this.service.updateSocketStatus('online');
} else {
this.service.updateSocketStatus('offline');
}
}.bind({service: socketStatusService}))
this.status$ = this.socketStatusService.socket_status$.subscribe(
status => {
this.status = status;
this.ref.tick();
}
)
}
socket-status.service.ts
:
@Injectable()
export class SocketStatusService {
private socket_status = new BehaviorSubject<string>("offline");
socket_status$ = this.socket_status.asObservable();
updateSocketStatus(status: string) {
this.socket_status.next(status);
}
}
虽然这可行,但我觉得必须有一种更优雅的方式来实现这种行为。
最好的情况是直接在 ipc 回调中设置组件的类属性并触发更改检测......到目前为止,我还无法让它工作,所以任何帮助将不胜感激。
(ps另外,我不知道为什么我必须手动触发this.ref.tick()
,这不是我记得在angular 2的早期beta版本中触发变化检测时必须做的事情......)