为什么在 angular 指令 `ngForm` 中使用了 "preLink" 函数,而不是常规的 "postLink" 函数?
Why a "preLink" function is used in angular directive `ngForm`, instead of regular "postLink" function?
里面angular.js,在ngForm(form)指令定义中,编译函数returns只有一个preLink
函数。为什么应该是 preLink
而不是常见的 postLink
?
以下代码来自angular.js master分支:
var formDirective = {
name: 'form',
restrict: isNgForm ? 'EAC' : 'E',
controller: FormController,
compile: function ngFormCompile(formElement) {
// Setup initial state of the control
formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
return {
pre: function ngFormPreLink(scope, formElement, attr, controller) {
// if `action` attr is not present on the form, prevent the default action (submission)
if (!('action' in attr)) {
// we can't use jq events because if a form is destroyed during submission the default
// action is not prevented. see #1238
//
// IE 9 is not affected because it doesn't fire a submit event and try to do a full
// page reload if the form was destroyed by submission of the form via a click handler
// on a button in the form. Looks like an IE9 specific bug.
var handleFormSubmission = function(event) {
scope.$apply(function() {
controller.$commitViewValue();
controller.$setSubmitted();
});
event.preventDefault();
};
...
pre-link 函数在任何 child 指令之前执行,因此它是准备任何数据以供 child 指令使用的好地方。我假设在这种情况下它会准备提交处理程序,以防 child 指令在其 post-link 函数中提交表单。
实际上 link 函数的执行顺序是:
- parent pre-link
- child pre-link
- child post-link
- parent post-link
里面angular.js,在ngForm(form)指令定义中,编译函数returns只有一个preLink
函数。为什么应该是 preLink
而不是常见的 postLink
?
以下代码来自angular.js master分支:
var formDirective = {
name: 'form',
restrict: isNgForm ? 'EAC' : 'E',
controller: FormController,
compile: function ngFormCompile(formElement) {
// Setup initial state of the control
formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
return {
pre: function ngFormPreLink(scope, formElement, attr, controller) {
// if `action` attr is not present on the form, prevent the default action (submission)
if (!('action' in attr)) {
// we can't use jq events because if a form is destroyed during submission the default
// action is not prevented. see #1238
//
// IE 9 is not affected because it doesn't fire a submit event and try to do a full
// page reload if the form was destroyed by submission of the form via a click handler
// on a button in the form. Looks like an IE9 specific bug.
var handleFormSubmission = function(event) {
scope.$apply(function() {
controller.$commitViewValue();
controller.$setSubmitted();
});
event.preventDefault();
};
...
pre-link 函数在任何 child 指令之前执行,因此它是准备任何数据以供 child 指令使用的好地方。我假设在这种情况下它会准备提交处理程序,以防 child 指令在其 post-link 函数中提交表单。
实际上 link 函数的执行顺序是:
- parent pre-link
- child pre-link
- child post-link
- parent post-link