为什么 Angular 使用ng-click="f()"
属性来处理点击事件,而不是$(el).on('click', f)
?
我问这个是因为使用 htmlonclick
属性通常被认为是一种不好的做法,那么为什么 Angular 使用这种方法呢?
为什么 Angular 使用ng-click="f()"
属性来处理点击事件,而不是$(el).on('click', f)
?
我问这个是因为使用 htmlonclick
属性通常被认为是一种不好的做法,那么为什么 Angular 使用这种方法呢?
你的困惑来自对背后的误解onclick
和ng-click
。虽然它们都是属性,但它们是由不同的实体处理的。前者是在DOM元素发生点击事件时添加事件监听器触发回调的方式。此属性由浏览器处理,您在此属性中指定的回调由浏览器执行。后者被称为属性形式的角度指令,浏览器对此一无所知。它由框架处理,一些逻辑,如触发事件处理程序,由框架设置。如果您不使用该框架,ng-click
那么将在无人看管的情况下生活在那里,并且您不会在click
事件上执行回调。
这是指令的相关部分- 框架在处理属性ngClick
时执行的代码:ng-click
ngEventDirectives['ngClick'] = ['$parse', '$rootScope', function($parse, $rootScope) {
return {
restrict: 'A',
compile: function($element, attr) {
// fn "points" at the function you specified in the `ng-click`
// and will be executed below when a click event occurs
var fn = $parse(attr['ngClick'], null, true);
return function ngEventHandler(scope, element) {
element.on(eventName, function(event) {
var callback = function() {
// here `fn` is being executed
fn(scope, {$event:event});
};
if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
scope.$evalAsync(callback);
} else {
scope.$apply(callback);
}
});
};
}
};
}];
可以看到,当 Angular 处理ng-click
属性时,它会执行函数ngEventHandler
,该函数将自定义回调绑定到click
DOM 的事件:
element.on(eventName, function(event) {
当您设置 DOM 元素的“onclick”属性时,该值仍然是您指定的值。浏览器不会执行与在 HTML 源代码中创建“onclick”属性时相同的“将字符串转换为函数”操作。
“ng-”属性由 Angular 代码解释,它可以做任何想做的事情来设置事件处理程序,包括将字符串视为函数的主体。
如果你想通过 DOM "onclick" 属性设置一个事件处理程序,你必须分配一个函数,而不是一个字符串:
foo.onclick = myFunction;
或者
foo.onclick = function() { myFunction(someArgument); };
The magic behind two way binding
is digest cycle
.
$apply
?
$apply
takes you from javascript context
to angular context
. Internally uses $digest
(triggers digest cycle).So, Javascript - $apply - digest cycle - view
.
Difference between $(element).on('click', callback)
and ng-click
.
1.$(element).on('click', callback)
$(element).on('click', function(){
//do your stuff
//It is in Javascript context
//Not known to angular
})
2.ng-click
implentation
element.on(eventName, function(event) { //Here, event name is 'click'
var callback = function() {
fn(scope, { $event: event });
};
scope.$apply(callback); //Here, ng-click wraps your code in $apply to take you from javascript context to angular context (Triggers digest cycle).
});
$("#my-button").on('click', myFunction)
是 JavaScript 中的代码,使用 jQuery。
ng-click = "myFunction()"
正在使用 AngularJS 读取标签属性的能力。
onclick = "myFunction();"
是调用函数的“旧”HTML 方式。