我是 Electron 的新手,目前正在构建一个小型应用程序,它重用了我之前构建的 Angular 应用程序中的一些代码。
这是我正在尝试做的事情:我有一个主要的 BrowserWindow(正在填充来 self 使用 angular 访问的网络服务的数据),当用户单击其中一个按钮时,我想打开另一个 BrowserWindow 并显示其中的一些数据(数据与用户点击的内容有关)。我想出了如何打开另一个 BrowserWindow 以及如何将一些参数传递给它的方法,请参见下面的代码示例。
当用户点击按钮时,这段代码被执行,一个新的 BrowserWindow 打开。
const BrowserWindow = remote.BrowserWindow;
var cubeWindow = new BrowserWindow({ width: 800, height: 600, frame: false });
var cube = path.resolve(__dirname, '../cube.html');
cubeWindow.loadURL(cube);
var data = {
id: "1",
name: "this"
};
cubeWindow.webContents.on('did-finish-load', ()=> {
cubeWindow.webContents.send('cube-data', data);
})
这里我访问刚打开的 BrowserWindow 中的数据(这个 javascript 文件在 cube.html 中被引用):
require('electron').ipcRenderer.on('cube-data', (event, message) => {
console.log(message);
});
数据对象的内容被记录在新的 BrowserWindow 中,目前一切顺利。现在回答我的问题:如何访问在 cube.html 中运行的 Angular 应用程序/ Controller 中的数据对象?
我试过这样做,但是不行:
var data;
require('electron').ipcRenderer.on('cube-data', (event, message) => {
console.log(message);
data = message;
});
angular.module('testApp', [])
.controller('appCtrl', function($scope) {
$scope.data = data;
console.log('Data: ' + $scope.data);
});
来自 Angular Controller 的日志条目说数据未定义,我认为这是因为在 ipcRenderer 发送/接收消息之前 Controller 实际上被评估了?
有没有办法在 Angular 中访问已发送的消息?
最佳答案
尝试将 cube-data
事件处理程序放入 Controller 代码中:
angular.module('testApp', [])
.controller('appCtrl', function($scope) {
$scope.model = {
data: null
}
function attachCubeDataHandler() {
require('electron').ipcRenderer.on('cube-data', (event, message) => {
console.log(message);
$scope.model.data = message;
});
}
function initialize() {
attachCubeDataHandler();
}
// Invoke initialization
initialize();
});
这样你首先初始化 Controller ,然后在事件响应到来时解析它。此外,如果将代码放在 Controller 中,则可以直接使用 $scope
来更新 View 的数据。我用另一个对象 (model
) package 了 data
以确保在 data
对象更改时更新 View 。
关于javascript - 在 Angular Controller 中从 webContents.send(..) 访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41225572/