if (index < 0 || index >= array.length) { // Don't use this index. This is out of bounds (borders, limits, whatever). } else { // Yes, you can safely use this index. The index is present in the array. Object element = array[index]; }
См. также:
Обновление: в соответствии с вашим фрагментом кода,
for(int i = 0; i<=name.length; i++) {
Индекс содержит длину массива. Это за гранью. Вы должны заменить <=
на <
.
for(int i = 0; i < name.length; i++) {
Если обратный вызов действительно из стороннего источника вне контекста выполнения AngularJS, можно просто использовать $apply
:
portal.controller('portalViewController', function($scope) {
storage.get('portal_url', (err, data) => {
$scope.$apply(function() {
$scope.url = data.url;
});
});
});
Из Документов:
AngularJS изменяет нормальный поток JavaScript, предоставляя свой собственный цикл обработки событий. Это разбивает JavaScript на классический контекст исполнения и AngularJS. Только операции, которые применяются в контексте выполнения AngularJS, получат выгоду от привязки данных AngularJS, обработки исключений, просмотра свойств и т. Д. Вы также можете использовать
$apply()
для ввода контекста выполнения AngularJS из JavaScript.Имейте в виду, что в большинстве мест (контроллеры, службы)
$apply
уже вызывается для вас директивой, которая обрабатывает событие. Явный вызов$apply
необходим только при реализации пользовательских обратных вызовов событий или при работе со сторонними обратными вызовами библиотеки.[/g3]
- Руководство для разработчиков AngularJS - Интеграция с циклом событий браузера
Преобразование API на основе обратного вызова в API-интерфейс на основе AngularJS
Можно интегрировать API-интерфейс обратного вызова в структуру AngularJS, создав службу:
app.service("storageAPI", function($q) { this.get = function(url) { var deferred = $q.defer(); storage.get(url, (err, data) => { if (err) { deferred.reject(err); } else { deferred.resolve(data); }; }); return deferred.promise; }; });
Использование:
app.controller('portalViewController', function($scope, storageAPI) { storageAPI.get('portal_url') .then(function(data) { $scope.url = data.url; }).catch(function(err) { console.log(err); }); });
Преимущество этого подхода заключается в том, что он интегрирует API в AngularJS без необходимости
$apply
(услуга $ q делает это автоматически). Кроме того, он эффективно обрабатывает ошибки API.Дополнительные сведения см. В разделе - AngularJS $ q Service API Reference - API отложенного доступа .