4

我是解析器和格式化程序的新手。我有一個指令,將對模型的變化進行驗證。要做到這一點的一種方法是$ watch,但從我所瞭解的情況來看,這不是一種好方法,因爲它允許更新模型。在輸入文本框中不會調用解析器函數

所以我一直在尋找的解析器,並試圖將此代碼

app.directive('myDirective', function($compile) { 


return { 
    restrict: 'E', 
    require: 'ngModel', 
    scope: { 

    }, 

    link: function($scope, elem, attr, ctrl) { 
     console.debug($scope); 
     ctrl.$formatters.push(function(value) { 
     console.log("hello1"); 
     return value; 
     }); 
     ctrl.$parsers.unshift(function(value) { 

     debugger; 
     console.log("hello"); 
     return value; 
     }); 
    } 
    }; 
}); 

但解析器函數永遠不會被調用。格式化程序被調用一次。 Please see the plunkr。任何人都可以告訴我我在做什麼錯,爲什麼在我輸入文本框時解析器函數沒有被調用?

+1

嘗試ctrl。$ parsers.push,仍然不起作用 – Abhik

回答

1

這是一個遲到的迴應,但僅供參考: 我想你錯過了「膠水」,將發生ui更改時將調用$parsers。這應該是這樣的:

app.directive('myDirective', function($compile) { 

return { 
    restrict: 'E', 
    require: 'ngModel', 
    scope: { 

    }, 

    link: function($scope, elem, attr, ctrl) { 
     console.debug($scope); 
     ctrl.$formatters.push(function(value) { 
     console.log("hello1"); 
     return value; 
     }); 
     ctrl.$parsers.unshift(function(value) { 
     return value; 
     }); 
     scope.$watch('directive model here', function() { 
     ctrl.$setViewValue(<build model from view here>); 
     }); 
    } 
    }; 
}); 

有關完整的參考請參閱this(真棒)帖子。

0

您的link函數未被調用,因爲關聯的DOM元素沒有改變,只是模型是。這工作:

HTML:

This scope value <input ng-model="name" my-directive> 

JS:

app.directive('myDirective', function($compile) { 
    return { 
     require: 'ngModel', 
     link: function($scope, elem, attr, ctrl) { 
      ctrl.$parsers.unshift(function(value) { 
       console.log("hello"); 
      }); 
     } 
    }; 
}); 

here更多的時候link函數被調用的。