2014-06-12 51 views
3

我從一個自定義的指令,我已經寫了這個錯誤:

Error: [$compile:nonassign] http://errors.angularjs.org/1.2.16/$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 

上的文件upload.js的81行的指令代碼(oFReader.onload文件上傳.js文件:81)是:

scope.fileUploadImage = attachment; 
scope.fileUploadLoading = false; 

scope.$apply(); //line 81 

scope.fileUploadCallback(); 

這裏是哪裏調用指令在我的視圖文件:

<div file-upload 
file-upload-image="fileAttachment" 
file-upload-loading="" 
file-upload-error="errors" 
file-upload-limit="1048576" 
file-upload-callback="attachFile()" 
class="field"> 

代碼工作爲例外,但我不能看米擺脫這個錯誤。任何幫助?

回答

3

在AngularJS中顯示的鏈接,您可以actually go to,在這種情況下,當你到了錯誤的描述頁面,它會說

Expression '' used with directive 'fileUpload' is non-assignable!

該指令是做

scope.fileUploadLoading = false; 

但是,你」沒有通過範圍變量到file-upload-loading屬性:

file-upload-loading="" 

這意味着它分配指令內的值,然後應用更改,AngularJS找到更改並執行雙向數據綁定,僅發現它無處存儲false值,因爲該屬性上未給出變量。實際上,它試圖將虛假分配給無。

你可以做擺脫錯誤消息的是,要麼添加一些未使用的屬性:

file-upload-loading="iDontEvenUseThis" 

甚至從來沒有看它,也可能指令可以讓你完全忽略的屬性,這儘管如此,依賴於指令的實現。

0

另一種選擇是檢查您的指令是否有一個值在分配給它之前分配。

/** 
 
* 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); 
 
}

一個例子使用:

.directive('yourDirectiveName', function() { 
 
    return { 
 
    scope: { 
 
     fileUploadLoading: "=", 
 
     ... 
 
    }, 
 
    link: function($scope, element, attrs) { 
 
     ... 
 
     if(isAssignable(attrs, 'fileUploadLoading')) { 
 
     $scope.fileUploadLoading = newValue; 
 
     } 
 
    } 
 
    }; 
 
});

希望它能幫助。