const fetchSubscriptions = () => {
let options = [];
// setTimeout(500);
$("#list").empty();
if (e.selectedIndex >= 0) {
let selHost = e.options[e.selectedIndex].value; // Gets the value of only the selected server
let address = selHost;
let port = $("#node-input-port").val();
const ip = address + port;
console.log("Subscriptions triggered");
const url =
fetch(url)
.then((res) => res.json())
.then((data) => {
data.forEach((item) => {
options.push({
v: `UNSUBSCRIBE ${item} WebEvent/1.0`,
t: item.substring(30, 60),
});
});
for (let i = 0; i < options.length; i++) {
let value = options[i].v;
let text = options[i].t;
$("#list").append(
$("<option></option>").attr("value", value).text(text)
);
}
});
}
};
Any idea why when i close the node my websocket works fine but in console i get an error "Cannot Read Property Value of Undefined
Everytime the value changes on websocket it logs that error:
When the node is opened it doesnt give the error and it works fine.
It doenst matter. Just this code is important. I get the error only when my node dialog is closed. When its opened it all works. Its like it forgets the option selected
Ws connection happens when i select a certain option in dropdown.
The error i get is in the browser console.
the error is following => VM854:259 Uncaught TypeError: Cannot read property 'selectedIndex' of undefined
This error comes only if my node is closed. When its opened the selected index is 1.
The property undefined is the e.selectedIndex in the code i've sent above.
If the node dialog is closed, then why have you still got code running in the editor? Your oneditsavemust clean up anything you have done, like create websocket connections.
But the fact remains, you aren't showing us the code that is logging the error. Until you do that, we cannot help.
The code is running because its my websocket, It runs everytime the value changes. I think it forgets the value in my dropdownThe server value i get in dropdown is stored in global context. How could i make it remember the value. I made the code on oneditsave to remember the value after closing. But since the values i get from global context i dont know how to make it selected
Ill send u the code in a sec
EDIT : Here is the code:
$.getJSON("getGlobalHostConfig", function (data) {
let server = [];
data.forEach((item) => {
server.push({
v: item.Host,
t: item.Host,
});
});
console.log("getGlobalHostConfig" + server);
for (let i = 0; i < server.length; i++) {
let value = server[i].v;
let text = server[i].t;
$("#node-input-server").append(
$("<option></option>").attr("value", value).text(text) // For every element in the select tag append appropriate value and text ( <option value="#">#</option> )
);
}
Why cant i unsubscribe something from the websocket. When i click on the option and then click buttonSub it subscribes the option to the websocket. Then it fetches the subscribed options and puts it in another dropdown. When i select option from that other dropdown and click on the buttonUnSub it unsubscribes it.That all works fine when i 1st open the node and subscribe. When i reopen the node i cant unsubscribe it anymore.
const unsubscribe = () => {
let e = $("#node-input-server")[0];
if (e.selectedIndex >= 0) {
let selHost = node.selectValue; // Gets the value of only the selected server
let address = selHost;
let port = node.portValue;
const ip = address + ":" + port;
let urlPath = `ws://${ip}/webevent/`;
// console.log("UnSubscribe: " + urlPath);
if (!wsOpened) {
globalws = new WebSocket(urlPath);
// console.log("globalws recreated");
globalws.onopen = () => {
// console.log("wsOpened:" + wsOpened);
DoOpenActions("#list");
fetchSubscriptions();
};
} else {
DoOpenActions("#list");
fetchSubscriptions();
}
globalws.onmessage = (e) => {
DoReceiveActions(e);
};
}
};