У меня есть функция внутри контроллера, и я смущен тем, как обновить переменную $ scope изнутри функции.then.
Вот моя функция:
searchSpotify(query, $scope) {
this.Spotify.search(query,'track').then(function (data) {
console.log(data.tracks.items); // this is working
$scope.result = data;
});
}
В журнале консоли я получаю эту ошибку:
TypeError: Cannot set property 'result' of undefined
Использовать ли значение $ scope. $?
РЕДАКТИРОВАТЬ:
Здесь весь контроллер для контекста
(function() {
class SelectionController {
constructor(User, groupService, selectionService, songService, $scope, $routeParams, Spotify) {
this.groupId = $routeParams.groupId;
this.selectionId = $routeParams.selectionId;
this.groupService = groupService;
this.selectionService = selectionService
//this.selections = this.selectionService.getSelections();
this.songService = songService;
this.searchResults;
this.$scope = $scope;
this.Spotify = Spotify
}
searchSpotify(query) {
this.Spotify.search(query, 'track').then(function(data) {
console.log(data.tracks.items);
$scope.result = data;
});
}
addSong(name, artist, album) {
alert('called from selection controller');
this.songService.addSong(this.selectionId, name, artist, album);
}
createSelection(name, description) {
this.selectionService.createSelection(this.groupId, name, description);
}
deleteSelection(selection) {
this.selectionService.deleteSelection(selection);
}
}
angular.module('songSelectionApp')
.controller('SelectionController', SelectionController);
})();
Сохранить ссылку на $ scope:
searchSpotify(query) {
var $scope = this.$scope;
this.Spotify.search(query, 'track').then(function(data) {
console.log(data.tracks.items);
$scope.result = data;
});
}
Или используйте функции стрелок:
searchSpotify(query) {
this.Spotify.search(query, 'track').then((data) => {
console.log(data.tracks.items);
this.$scope.result = data;
});
}
.bind(this)
также должно работать, как предлагают другие ответы.
Что касается $scope.$apply
: вам нужно это, только если вы хотите изменить $scope
за пределами $digest
, например, когда вы используете внешние (не угловые) библиотеки/функции, такие как WebSocket
или прослушиватели событий jquery. Пока Spotify
не является угловой услугой/фабрикой - вам не нужно $scope.$apply
Из документов:
$ apply() используется для выполнения выражения в угловом формате вне рамок. (Например, из событий браузера DOM, setTimeout, XHR или сторонних библиотек).
Вы должны использовать
this.Spotify.search(query,'track').then(function (data) {
console.log(data.tracks.items); // this is working
this.$scope.result = data;
}.bind(this));
this.Spotify.search(query,'track').then(function (data) {
console.log(data.tracks.items); // this is working
this.result = data;
}.bind($scope));
Должно быть все, что нужно. Вы в основном говорите о внутренней сфере, что this
действительно должно быть
$scope
не определен. Ваш пример будет работать, если вы передадите .bind(this.$scope)
then
как другая область видимости. Вы можете использовать функцию стрелки, если вы используете ES6, илиbind()