我昨天已经从angular 1.0.8迁移到了angular 1.2.2,除了一堆其他损坏的东西之外,我已经修复了,下面指令上的$render函数不再启动。
以前有人见过这样的行为吗?0
directive('validFile', function (utils, $filter) {
return {
require: 'ngModel',
link: function (scope, el, attrs, ngModel) {
if(utils.isMobileAgent())
return;
var form = el.parents().find('form');
ngModel.$render = function () {
debugger;
if(form.hasClass('ng-pristine'))
return;
if(el.val() && el.val().length > 0){
ngModel.$setViewValue(el.val());
}
if(el.hasClass('ng-invalid')){
el.parent().addClass('ng-invalid').addClass('ng-invalid-required');
ngModel.$setValidity(attrs.name, false);
ngModel.$setPristine(attrs.name, false);
scope.fileMsg = $filter('translate')('PLEASESELECT') + ' ' + $filter('translate')(attrs.name);
// scope.layout.showFileError = true;
}
else{
el.parent().removeClass('ng-invalid').removeClass('ng-invalid-required').addClass('ng-valid');
ngModel.$setValidity(attrs.name, true);
}
};
el.bind('mouseover', function(){
if(form.hasClass('ng-dirty') && el.parent().hasClass('ng-invalid'))
el.removeClass('ng-pristine');
});
el.bind('mouseleave', function(){
if(el.val() && el.val().length > 0){
el.addClass('ng-pristine');
}
})
el.bind('change', function () {
scope.$apply(function () {
ngModel.$render();
});
});
form.bind('change', function () {
scope.$apply(function () {
ngModel.$render();
});
});
}
};
});
标记:
<input type="file" data-ng-model='model.formData.resume' name="resume" data-valid-file data-my-validate data-value-required="true">
将指令的优先级提高到0以上。
例如:
myApp.directive('validFile', function ($filter) {
return {
priority: 10,
以下是我发现的与这个ui同义词问题相关的问题的详细解释,这个问题的根源与你的问题相同。
简短的解释是,此更改导致input
的$render
优先于您自己的。实际上,通过更改指令的优先级,您可以赋予$render
优先级,就像1.2 rc3中更改之前一样。
我已经用angular 1.2.10为文本框测试了这一点,无论我设置了什么优先级,最初的输入$render方法都是在之后设置的,覆盖了我的$render函数。
这个问题也发生在angular ui tinymce模块中,该模块无法呈现初始模型值。因此,我更改了tinymce指令中的超时部分,以覆盖原始的$render方法,如下所示:
var render = function() { // my rendering code }
setTimeout(function () {
tinymce.init(options);
if (ngModel.$render != render) {
var originalRender = ngModel.$render;
ngModel.$render = function() {
originalRender();
render();
};
}
});
这样,在执行完所有"链接"函数后,可以覆盖渲染方法。