0

Фон: Работа на угловых передних концах. Получение документа, который base64 кодируется из бэкэнд. atob дает мне ошибку, но все работает.AngularJS Promise & atop Filter. Не удалось выполнить 'atob' на 'Window'

Suspicion: Я думаю, что мой фильтр atob вызывается дважды. Попытка обещать, пока переменная не определена/null, а затем после того, как обещание заполнит эту переменную.

Фильтр Код:

angular.module('docFilters', []).filter('base64Decode', function() { 
    return function(cipherText) { 
     return atob(cipherText); 
    }; 
}); 

Controller Код:

angular.module('doc') 
    .controller('DocCtrl', ['$scope', 'DocService', function ($scope, DocService) { 
     $scope.doc = DocService.getCurrentDoc();  
    }]); 

getCurrentDoc() является запрос REST. Он делает запрос GET для внутренней веб-службы.

Html:

<span ng-bind-html="doc.content | base64Decode"></span> 

Это работает 'отлично' - без проверки консоли вы никогда не знаете. На консоли показаны:

Ошибка: не удалось выполнить «atob» в «окне»: строка, подлежащая расшифровке, неправильно закодирована ».

Это ново для меня, поэтому я не уверен, есть ли лучший способ.

ответ

1

atob(undefined); //throws an error

Вы должны изменить фильтровать

angular.module('docFilters', []).filter('base64Decode', function() { 
    return function(text) { 
     return text && atob(text); 
    }; 
}); 
+0

Я пошел с этим. Возможно, потому что я новичок, но это просто элегантно выглядело, и это тот код, который вернул меня к программированию через системы. Это похоже на тройной оператор? Возьмите текст, пока переменная не заполнится обещанием, а затем расшифрует зашифрованный текст? – HayekSplosives

+0

@HayekSplosives 'A && B' по существу означает« если A тогда B else A ». – JLRishe

+0

@HayekSplosives Работает из-за «лени» оператора '&&'. Рассмотрим 'A && B', если' A' является ложным, вам не нужно оценивать 'B', в противном случае вам нужно проверить, является ли' B' правдой. Вы можете переписать его, используя тернарный оператор 'return A? B: A'. –

1

Почему нет проверки фильтра, есть ли значение?

angular.module('docFilters', []).filter('base64Decode', function() { 
    return function(cipherText) { 
     if (cipherText) { 
      return atob(cipherText); 
     } 
    }; 
}); 
+0

Поскольку я все еще достаточно новый, я не знаю, как это сделать. Я понимаю концепцию, но не реализацию. Ty! – HayekSplosives

Смежные вопросы