관련 권장사항: "angularjs 튜토리얼"
angularjs는 vue의 DefineProperty와는 다른 원칙을 가지고 있습니다. 여기에는 몇 가지 요약이 있습니다.
AngularJs는 vm 구성 요소이고 범위는 vm 구성 요소의 데이터 모음입니다.
- AngularJs는 vm의 동작을 선언하기 위해 지시문을 사용하여 속성의 변경 사항을 수신합니다. 범위 및 최신 속성 업데이트 UI
- AngularJs의 양방향 바인딩: 예: $scope 속성 값이 변경되면 인터페이스도 변경됩니다. 다른 하나는 $scope 속성 값을 인터페이스에 바인딩하는 것입니다. 클릭, 입력 및 선택과 같은 작업은 $scope 속성의 변경 사항을 자동으로 트리거합니다. 그에 따라 인터페이스도 변경될 수 있음)
- 범위 속성 변경 모니터링: dirty check
- Dirty check
angular는 모든 데이터 변경 사항을 모니터링하지 않지만 적절한 시간($watch)에 $rootScope에서 시작하여 모든 $scope를 탐색합니다. ,
- 해당 속성 값이 변경되었는지 확인하고, 변경 사항이 있는 경우 더티 변수를 사용하여 이를 true로 기록하고 Traverse($digest),
- 등을 다시 수행합니다. 특정 순회가 완료되고 이러한 $scope의 속성 값이 변경되지 않은 경우 순회가 종료됩니다.
- 더티 변수가 레코드로 사용되기 때문에 더티 검사 메커니즘이라고 합니다.
- 간단히 말하면, 범위가 생성되면 각도는 템플릿을 구문 분석하고 바인딩 값과 이벤트 호출을 찾아 $watch로 바인딩합니다.
$scope.$watch(string|function, listener, objectEquality, prettyPrintExpression) // string: 验证值或者function执行后return的string // listener: 如果验证值不同,则执行该监听函数 // objectEquality:执行深检查바인딩을 완료한 후 이러한 속성이 변경되면 $watch가 실행되고 해당 정보가 각도 내부의 $$watchers에 바인딩됩니다.
- 큐(배열)이며 $digest가 트리거되면 각도가 이 배열을 통과합니다.
- 더티 변수를 사용하여 $$watchers에 기록된 $scope 속성이 변경되었는지 기록합니다.
- 다음 프로세스:
- Traverse $$watchers, 해당 속성 값의 이전 값과 새 값을 꺼내고 objectEquality를 기반으로 이전 값과 새 값을 비교합니다.
- 두 값이 다르면 계속 실행하세요. 두 값이 동일한 경우 dirty를 false로 설정합니다.
- 모든 감시자를 확인한 후에도 더티가 여전히 true이면 더티를 true로 설정하고 이전 값을 새 값으로 바꿉니다.
- 이렇게 하면 다음 재귀 라운드에서 이전 값이 됩니다. 이 라운드의 새 값 $digest를 다시 호출합니다(간단히 말하면 두 번의 재귀 순회를 수행하여 이전 값과 새 값의 변경 사항을 확인합니다)
- 변경된 $scope를 인터페이스에 다시 렌더링
- $apply 트리거 $digest
일반적으로 $digest는 호출되지 않습니다. $apply를 호출하면 내부적으로 $digest 재귀 탐색이 실행됩니다.
- angular의 내부 지침은 ng-click과 같은 $apply를 캡슐화하므로 일반적으로 수동으로 수행할 필요가 없습니다. call apply
- 수동으로 apply 호출
수동으로 실행해야 하는 경우도 있습니다
function($timeout) { // 当我们通过on('click')的方式触发某些更新的时候,可以这样做 $timeout(() => { // 内置语法糖 $http, $timeout已经包含了apply $scope.name = 'lily' }) // 也可以这样做 $element.on('click', () => { $scope.name = 'david' $scope.$apply() }) }
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>angularjs脏检查实现</title>
</head>
<style type="text/css">
button {
height: 60px;
width: 100px;
}
p {
margin-left: 20px;
}
</style>
<body>
<div>
<button type="button" ng-click="increase">增加</button>
<button type="button" ng-click="decrease">减少</button>
数量:<span ng-bind="data">0</span>
</div>
<br>
</body>
<script>
window.onload = function () {
/**
* 声明构造函数
*/
function Scope() {
this.$$watchList = []; // angular内部会声明一个数组(包含监听的对象),在digest执行时去遍历
}
/**
* 属性赋值给$scope
* 类似angular解析controller的模板,把模板中的属性解析出来,属性赋值给$scope
*/
Scope.prototype.getNewValue = function () {
return $scope[this.name];
}
/**
* 实现监听
*/
Scope.prototype.$watch = function (name, listener) {
let watch = {
name: name,
getNewValue: this.getNewValue,
listener: listener || function () { }
};
// 当作用域创建时,angular会去解析模板,$watch用来绑定监听值和监听函数
this.$$watchList.push(watch);
}
/**
* 检查dirty,循环更新scope上的最新值
*/
Scope.prototype.$digest = function () {
console.log('$digest');
let dirty = true; // 默认dirty变量为true
let checkTimes = 0;
while (dirty) {
dirty = this.$valScope();
checkTimes++;
if (checkTimes > 10 && dirty) {
throw new Error("循环过多");
}
}
}
/**
* 验证值是否有变化
*/
Scope.prototype.$valScope = function () {
let dirty;
let list = this.$$watchList;
for (let i = 0; i < list.length; i++) {
let watch = list[i];
let newValue = watch.getNewValue();
let oldValue = watch.last || undefined;
if (newValue !== oldValue) {
watch.listener(newValue, oldValue);
dirty = true; // 如果新旧值不同,则继续遍历
} else {
dirty = false;
}
watch.last = newValue;
}
return dirty;
}
/**
* 刷新scope
*/
Scope.prototype.$apply = function (params) {
let list = document.querySelectorAll('[ng-bind]');
console.log('list', list)
for (let i = 0, l = list.length; i < l; i++) {
let bindData = list[i].getAttribute('ng-bind');
console.log('bindData', bindData)
console.log('list[i]', list[i])
list[i].innerHTML = $scope[bindData];
}
}
let $scope = new Scope(); // 实例化,声明$scope对象集合
$scope.data = 0;
$scope.increase = function () {
this.data++;
};
$scope.decrease = function () {
this.data--;
};
$scope.$watch('data', function(newValue, oldValue) { // 监听
console.log("new: " + newValue + "=========" + "old: " + oldValue);
});
// 手动为button按钮添加onclick事件,并为通过闭包为其绑定了全局scope对象,绑定apply方法
// 类似angular内部实现
function startBind() {
let list = document.querySelectorAll('[ng-click]');
for (let i = 0, l = list.length; i < l; i++) {
list[i].onclick = (function (index) {
return function () {
let func = this.getAttribute('ng-click');
$scope[func]($scope);
$scope.$digest();
$scope.$apply()
}
})(i)
}
}
// 初始化
startBind();
}
</script>
</html>
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오
를 방문하세요! !위 내용은 Anglejs의 더티 검사 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

JavaScript 코어 데이터 유형은 브라우저 및 Node.js에서 일관되지만 추가 유형과 다르게 처리됩니다. 1) 글로벌 객체는 브라우저의 창이고 node.js의 글로벌입니다. 2) 이진 데이터를 처리하는 데 사용되는 Node.js의 고유 버퍼 객체. 3) 성능 및 시간 처리에는 차이가 있으며 환경에 따라 코드를 조정해야합니다.

javaScriptUSTWOTYPESOFSOFCOMMENTS : 단일 라인 (//) 및 multi-line (//)

Python과 JavaScript의 주요 차이점은 유형 시스템 및 응용 프로그램 시나리오입니다. 1. Python은 과학 컴퓨팅 및 데이터 분석에 적합한 동적 유형을 사용합니다. 2. JavaScript는 약한 유형을 채택하며 프론트 엔드 및 풀 스택 개발에 널리 사용됩니다. 두 사람은 비동기 프로그래밍 및 성능 최적화에서 고유 한 장점을 가지고 있으며 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

Python 또는 JavaScript를 선택할지 여부는 프로젝트 유형에 따라 다릅니다. 1) 데이터 과학 및 자동화 작업을 위해 Python을 선택하십시오. 2) 프론트 엔드 및 풀 스택 개발을 위해 JavaScript를 선택하십시오. Python은 데이터 처리 및 자동화 분야에서 강력한 라이브러리에 선호되는 반면 JavaScript는 웹 상호 작용 및 전체 스택 개발의 장점에 없어서는 안될 필수입니다.

파이썬과 자바 스크립트는 각각 고유 한 장점이 있으며 선택은 프로젝트 요구와 개인 선호도에 따라 다릅니다. 1. Python은 간결한 구문으로 데이터 과학 및 백엔드 개발에 적합하지만 실행 속도가 느립니다. 2. JavaScript는 프론트 엔드 개발의 모든 곳에 있으며 강력한 비동기 프로그래밍 기능을 가지고 있습니다. node.js는 풀 스택 개발에 적합하지만 구문은 복잡하고 오류가 발생할 수 있습니다.

javaScriptisNotBuiltoncorc; it'SangretedLanguageThatrunsonOngineStenWrittenInc .1) javaScriptWasDesignEdasAlightweight, 해석 hanguageforwebbrowsers.2) Endinesevolvedfromsimpleplemporectreterstoccilpilers, 전기적으로 개선된다.

JavaScript는 프론트 엔드 및 백엔드 개발에 사용할 수 있습니다. 프론트 엔드는 DOM 작업을 통해 사용자 경험을 향상시키고 백엔드는 Node.js를 통해 서버 작업을 처리합니다. 1. 프론트 엔드 예 : 웹 페이지 텍스트의 내용을 변경하십시오. 2. 백엔드 예제 : node.js 서버를 만듭니다.

Python 또는 JavaScript는 경력 개발, 학습 곡선 및 생태계를 기반으로해야합니다. 1) 경력 개발 : Python은 데이터 과학 및 백엔드 개발에 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 적합합니다. 2) 학습 곡선 : Python 구문은 간결하며 초보자에게 적합합니다. JavaScript Syntax는 유연합니다. 3) 생태계 : Python에는 풍부한 과학 컴퓨팅 라이브러리가 있으며 JavaScript는 강력한 프론트 엔드 프레임 워크를 가지고 있습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구