我試圖在子自定義指令中觸發onchange
事件時更新父級作用域變量。 我在使用兒童指令(input
文件)中使用的事件是由jqLite觸發的onchange
。這意味着,在角度範圍外操作 。爲了更新範圍,我使用scope.$evalAsync
函數(也嘗試了$timeout
和scope.$apply
)。在父母定製指令中,我使用$watch
函數作爲偵聽器。在Firefox中只更新父級隔離作用域
請大家在jsfiddle完整的例子來看看
標記
<div ng-app='myApp'>
<parent></parent>
</div>
腳本
var myApp = angular.module('myApp', []);
myApp.directive('parent', function() {
return {
restrict: 'E',
template: '<div class="parent">Parent' + '<span class="file-name">{{selectedFileName}}</span>' + '<child files="files"></child>' + '</div>',
scope: {
files: '='
},
link: function(scope){
scope.$watch('files', function(newVal) {
if (newVal && newVal.length > 0) {
scope.selectedFileName = "selected file name: " + newVal[0].name;
}
});
}
};
});
myApp.directive('child', function() {
return {
restrict: 'E',
template: '<div class="child">Child<br />' + '<span class="file-name">{{selectedFileName}}</span>' + '<file-upload files="files"></file-upload>' + '</div>',
scope: {
files: '='
},
link: function(scope) {
scope.$watch('files', function(newVal) {
if (newVal && newVal.length > 0) {
scope.selectedFileName = "selected file name: " + newVal[0].name;
}
});
}
};
});
myApp.directive('fileUpload', function() {
return {
restrict: 'E',
template: '<input type="file" />',
scope: {
files: '='
},
link: function(scope, element) {
element.bind('change', function(e) {
scope.$evalAsync(function() {
scope.files = (e.srcElement || e.target).files;
});
});
}
};
});
在這個例子中,每次我選擇新文件的時間,父母範圍變量files
ar e完美更新,並調用其$watch
函數。
問題是,在Firefox的父母範圍$watch
函數只被調用一次。只在第一次。
在此先感謝