Я создаю собственный виджет наthingboard pe для вызова конечной точки API и отображения результатов в формате таблицы. Я столкнулся с этой ошибкой: self.ctx.$scope.$apply не является функцией, и, хоть убей, не могу найти решение. Глядя на консоль браузера, я знаю, что запрос API выполнен и получен статус 200 вместе с результатами в формате JSON. Кто-нибудь знает, как я могу это решить. вот мой код -
`
self.onInit = function() {
self.ctx.$scope.fetchData = function() {
const url = 'https://xxxxx.xxxxxxxxxxxxxx';
const username = 'xxxxxxxxxxxxxxxxxxx';
const password = 'xxxxxxxxxxxxxxxxx';
const headers = new Headers({
'Authorization': 'Basic ' + btoa(`${username}:${password}`),
'Content-Type': 'application/json'
});
fetch(url, { method: 'GET', headers: headers })
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
self.ctx.$scope.$apply(function() {
if (data && data.length > 0) {
self.ctx.$scope.data = data;
} else {
self.ctx.$scope.data = null;
}
});
})
.catch(error => {
console.error('Error fetching data:', error);
self.ctx.$scope.$apply(function() {
self.ctx.$scope.data = null;
});
});
};
self.ctx.$scope.fetchData();
};
Попробовал использовать $timeout вместо кубиков
Привет @Justinas. В каком смысле?
self.ctx.$scope = {}. Добавьте точку останова в строку $apply и проверьте self.ctx.$scopeизвини, можешь показать мне, у меня нет большого опыта работы с js



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что у вас установлено как self? это может помочь сделать console.info здесь:
.then(data => {
console.info(self, 'self'); // added this line to debug (if you don't see `$scope.$apply` then there's your answer)
self.ctx.$scope.$apply(function() {
console.info(self, 'self'); возвращает _system_customWidget 'self', если я вхожу в систему data, я вижу правильный ответ json API. Есть ли у вас какие-либо предложения о том, как я могу это исправить?
Да, я думаю, вы можете предположить, что data сейчас возвращается правильно. Проблема в этом обычае $scope.$apply. Это нигде не указано, но это приложение angularJS? Возможно, нам понадобится просмотреть «настройку» перед этим методом, чтобы определить, что такое self.ctx... если что. Вы унаследовали эту кодовую базу? console.infoging self должен был показывать какой-то объект, например {ctx: {$scope: $apply: Something}}, иначе он не существует.
вероятно, это связано с виджетами доски объявлений, а не с angularJS. Если да, то параметры, доступные для себя, перечислены в IDynamicWidgetComponent. Что вы пытаетесь сделать с помощью $scope.$apply?
Thingsboard $scope — это пользовательская структура и в ней нет функции $apply Angular.
Итак, просто сделайте следующее
...
.then(data => {
if (data && data.length > 0) {
self.ctx.$scope.data = data;
} else {
self.ctx.$scope.data = null;
}
})
...
Может быть, вы измените свою переменную
$scope?