Błąd AngularJS: [$ Compile: Nonassign]


Otrzymuję ten błąd z niestandardowej dyrektywy, którą napisałem:
Error: [$compile:nonassign] [url=http://errors.angularjs.org/1.2.16/]http://errors.angularjs.org/1.2.16/[/url]$compile/nonassign?p0=&p1=fileUpload
at Error (native)
(anonymous function) angular.js:9778
(anonymous function) angular.js:7216
h.$digest angular.js:12270
h.$apply angular.js:12516
oFReader.onload file-upload.js:81

Kod dyrektywy w linii 81 pliku file-upload.js (oFReader.onload file-upload.js: 81) to:
scope.fileUploadImage = attachment;
scope.fileUploadLoading = false;scope.$apply();//line 81scope.fileUploadCallback();

Oto miejsce, w którym nazywam dyrektywę w moim pliku widoku:
<div file-upload
file-upload-image="fileAttachment"
file-upload-loading=""
file-upload-error="errors"
file-upload-limit="1048576"
file-upload-callback="attachFile()"
class="field">

Kod działa jak wyjątek, ale nie mogę pozbyć się tego błędu. Czy ktoś pomoże?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Linki pokazane w AngularJS to ty

naprawdę może iść
https://docs.angularjs.org/err ... pload, w tym przypadku, gdy przejdziesz do strony z opisem błędu, powie

Wyrażenie „używane z dyrektywą„ fileUpload ”nie jest przypisane!

Dyrektywa sprawia
scope.fileUploadLoading = false;

Jednak zmienna zakresu nie została przekazana do atrybutu
file-upload-loading
:
file-upload-loading=""

Oznacza to, że przypisuje wartość w dyrektywie, a następnie stosuje zmiany, AngularJS zauważa zmiany i wykonuje dwukierunkowe wiązanie danych tylko po to, aby stwierdzić, że nie ma gdzie przechowywać wartości
false
, ponieważ zmienna nie został ustawiony w atrybucie. W gruncie rzeczy próbuje przypisać kłamstwa do niczego.
Co możesz zrobić, aby pozbyć się komunikatu o błędzie, albo dodawanie nieużywanej nieruchomości:
file-upload-loading="iDontEvenUseThis"

I nawet nie patrzeć na niego, a może dyrektywa może umożliwić na ogół pominięcie atrybutu, chociaż zależy od wykonania dyrektywy.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Inną opcją jest sprawdzenie w dyrektywie, czy przed przypisaniem do niej istnieje wartość do przypisania.
<div class="snippet-code">
<div class="snippet" data-hide="false" data-lang="js">
<pre class="snippet-code-js lang-js prettyprint-override">
/**
* Checks whether an attribute of a directive is defined and can be assigned a value.
* This is important for optional attributes in order to avoid the 'Non-assignable' angular error
* @param {object} attrs The attrs object retrieved in the directive link function
* @param {string} propertyName The name of the property to check
* @return {Boolean} True means that property is assignable
*/
function isAssignable(attrs, propertyName) {
var fn = $parse(attrs[propertyName]);
return angular.isFunction(fn.assign);
}

Przykład użycia:
<div class="snippet-code">
<div class="snippet" data-hide="false" data-lang="js">
<pre class="snippet-code-js lang-js prettyprint-override">
.directive('yourDirectiveName', function() {
return {
scope: {
fileUploadLoading: "=",
...
},
link: function($scope, element, attrs) {
...
if(isAssignable(attrs, 'fileUploadLoading')) {
$scope.fileUploadLoading = newValue;
}
}
};
});

Mam nadzieję że to pomoże.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się