찾다
웹 프론트엔드JS 튜토리얼AngularJS 모바일 개발의 함정

AngularJS 모바일 개발의 함정

Nov 18, 2016 am 11:52 AM
angularjs

상대적으로 말하면 Jquery는 DOM 작업에 중점을 두고 있는 반면 AngularJS는 뷰 모델과 양방향 바인딩에 중점을 두고 있습니다.

DOM 작업 문제

요소 노드 추가, 요소 노드 제거, 요소 콘텐츠 가져오기, 요소 숨기기 또는 표시 등 DOM 작업에 jQuery를 사용하지 마세요. 이러한 작업을 구현하려면 지시문을 사용해야 하며, 필요한 경우 직접 지시문을 작성해야 합니다.

웹 사이트 웹 프런트엔드 개발 시 습관을 바꾸는 것이 어렵다면 웹 페이지에서 jQuery를 제거하는 것을 고려해 보세요. 실제로 AngularJS의 $http 서비스는 매우 강력하며 기본적으로 jQuery의 ajax 기능을 대체할 수 있으며 AngularJS에는 jQLite가 포함되어 있습니다. 일반적으로 사용되는 jQuery DOM 작업 방법, 이벤트 바인딩 등을 포함하여 내부적으로 구현된 jQuery의 하위 집합입니다. . 하지만 이것이 AngularJS를 사용할 때 jQuery를 사용할 수 없다는 의미는 아닙니다. 웹 페이지에 jQuery가 로드된 경우 AngularJS는 jQuery를 먼저 사용하고, 그렇지 않으면 jQLite로 대체됩니다.

모바일 앱이나 모바일 웹 개발이라면 Jquery를 도입하지 않는 것이 좋습니다. Jquery의 일부 기능이 꼭 필요한 경우에는 Zepto.js를 도입하세요. 하지만 저를 믿으세요. AngularJS를 사용하면 Jquery가 필요하지 않습니다!

자신만의 지시문을 작성해야 하는 상황은 일반적으로 타사 jQuery 플러그인을 사용할 때입니다. 플러그인은 AngularJS 외부에서 폼 값을 변경하기 때문에 즉시 모델에 반영할 수 없습니다. 예를 들어, 우리는 jQueryUI datepicker 플러그인을 많이 사용합니다. 날짜를 선택하면 플러그인이 입력 입력 상자에 날짜 문자열을 채웁니다. View는 변경되지만 Model은 업데이트되지 않습니다. $('.datepicker').datepicker(); 이 코드는 AngularJS의 관리 범위에 속하지 않기 때문입니다. DOM 변경 사항을 모델에 즉시 업데이트하는 지시문을 작성해야 합니다.

var directives = angular.module('directives', []);
 
directives.directive('datepicker', function() {
   return function(scope, element, attrs) {
       element.datepicker({
           inline: true,
           dateFormat: 'dd.mm.yy',
           onSelect: function(dateText) {
               var modelPath = $(this).attr('ng-model');
               putObject(modelPath, scope, dateText);
               scope.$apply();
           }
       });
   }
});

그렇다면 이 지시문을 HTML에 소개합니다

<input type="text" datepicker ng-model="myObject.myDateValue" />

지시어는 HTML에 사용자 정의 태그 속성을 작성하여 플러그인 기능을 구현하고 HTML 기능을 효과적으로 보완하는 것입니다. 이 선언적 구문은 HTML을 확장합니다. 사용과 코드 유지 관리를 용이하게 하기 위해 프로젝트의 공통 기능과 페이지 구성 요소를 지시어로 캡슐화하는 것이 좋습니다.

Bootstrap 프레임워크의 플러그인과 jQuery를 기반으로 하는 기타 널리 사용되는 UI 구성 요소를 포함하여 우리가 사용할 수 있는 많은 지시문을 제공하는 AngularUI 프로젝트가 있다는 점에 유의해야 합니다. 이제 AngularJS 커뮤니티가 활성화되고 생태계가 탄탄해졌습니다.

ngOption의 값

은 큰 함정입니다. ngOption에 의해 생성된

여전히 개념을 변경할 필요가 있습니다. AngularJS는 더 이상 데이터 상호 작용에 양식을 사용하지 않고 모델을 사용합니다. $http를 사용하여 모델을 제출하고, PHP에서는 file_get_contents('php://input')를 사용하여 프런트 엔드에서 제출한 데이터를 얻습니다.

입력 유형='숫자' 문제

일부 AngularJS 버전에서는 입력 상자가 입력 유형='숫자'로 설정되면 모바일 장치에서 ng-change 메서드가 실패합니다. .

{{ }} 문제

페이지가 초기화되면 사용자에게 {{ }}가 표시될 수 있으며, 이후 실제 콘텐츠가 나타나기 전에 잠시 깜박입니다.
해결책:

ng-cloak 지시어를 사용하여 숨기기
{{ }} 대신 ng-bind 사용

비즈니스 로직에서 인터페이스 분리

컨트롤러는 DOM을 직접 참조해서는 안 되지만 뷰의 동작을 제어해야 합니다. 예를 들어 "사용자가 X를 조작하면 어떻게 될까요?", "어디서 구할 수 있나요?" 등은 인터페이스와 독립적이며 뷰의 논리와는 아무런 관련이 없습니다. 그 역할은 단순히 "X를 수행"하는 것입니다.

DOM 작업은 지시문 내부에 배치되어야 합니다.

기존 함수를 최대한 재사용하세요

작성한 함수는 AngularJS에서 구현되었을 가능성이 높습니다. 일부 코드는 보다 Angular 방식으로 추상화되어 재사용될 수 있습니다. 즉, jQuery의 지루한 코드 중 상당수를 대체할 수 있습니다.

1.ng-repeat

ng-repeat는 매우 유용합니다. Ajax가 서버에서 데이터를 가져온 후 우리는 종종 jQuery(예: 위에서 언급한 예)를 사용하여 일부 HTML 컨테이너 노드에 더 많은 요소를 추가하는데, 이는 AngularJS에서 나쁜 습관입니다. ng-repeat를 사용하면 모든 것이 매우 간단해집니다. $scope에 배열(모델)을 정의하여 서버에서 가져온 데이터를 저장한 다음 ng-repeat를 사용하여 이를 DOM에 바인딩합니다. 다음 예는 친구 모델을 초기화하고 정의합니다

<div ng-init="friends = [{name:&#39;John&#39;, age:25}, {name:&#39;Mary&#39;, age:28}]">
    I have {{friends.length}} friends. They are:
    <ul>
        <li ng-repeat="friend in friends">
            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
        </li>
    </ul>
</div>

2. ng-show

 

ng-show 也很有用。使用 jQuery 来根据条件控制界面元素的显示隐藏,这很常见。但是 Angular 有更好的方式来做到这一点。ng-show (以及 ng-hide) 可以根据布尔表达式来决定隐藏和显示。

对于数组或字符串,可以用strXXXX.length控制显示,否则在移动设备上会不正常。

类似的内置 directives 还有 ng-disabled, ng-switch 等等,用于条件控制,语法简洁,都很强大。

3. ng-class

ng-class 用于条件性地给元素添加 class,以前我们也经常用 jQuery 来实现。Angular 中的 ng-class 当然更好用了,例子:

...

在这里 ng-class 接受一个 object 对象,key 为 CSS class 名,值为 $scope 变量控制的条件表达式,其他类似的内置 directives 还有 ng-class-even 和 ng-class-odd,很实用。

ng-show和ng-if的使用场景问题

使用ng-show和ng-if都实现控制页面元素显示的功能,但2者是不同的,ng-if会动态创建DOM,ng-show只是切换已有DOM的显示,相当于设置style="display:none",如果使用before和after等css伪类控制显示效果,可能会出现问题,需要根据情况合理使用ng-show和ng-if。

$watch 和 $apply

AngularJS 的双向数据绑定是最令人兴奋的特性了,然而它也不是全能的魔法,在某些情况下你需要做一些小小的修正。

当你使用 ng-model, ng-repeat 等等来绑定一个元素的值时, AngularJS 为那个值创建了一个 $watch,只要这个值在 AngularJS 的范围内有任何改变,所有的地方都会同步更新。而你在写自定义的 directive 时,你需要定义你自己的 $watch 来实现这种自动同步。

有时候你在代码中改变了 model 的值,view 却没有更新,这在自定义事件绑定中经常遇到。这时你就需要手动调用 scope.$apply() 来触发界面更新。上面 datepicker 的例子已经说明了这一点。第三方插件可能会有 call back,我们也可以把回调函数写成匿名函数作为参数传入$apply()中。

将 ng-repeat 和其他 directives 结合起来

ng-repeat 很有用,不过它和 DOM 绑定了,很难在同一个元素上使用其他 directives (比如 ng-show, ng-controller 等等)。

如果你想对整个循环使用某个 directive,你可以在 repeat 外再包一层父元素把 directive 写在那儿;如果你想对循环内部的每一个元素使用某个 directive,那么把它放到 ng-repeat 的一个子节点上即可。

Scope的问题

Scope 在 templates 模板中应该是 read-only 的,而在 controller 里应该是 write-only 的。Scope 的目的是引用 model,而不是成为 model。model 就是我们定义的 JavaScript 对象。

$rootScope 是可以用的,不过很可能被滥用

Scopes 在 AngularJS 中形成一定的层级关系,树状结构必然有一个根节点。通常我们用不到它,因为几乎每个 view 都有一个 controller 以及相对应的自己的 scope。

但偶尔有一些数据我们希望全局应用在整个 app 中,这时我们可以将数据注入 $rootScope。因为其他 scope 都会继承 root scope,所以那些注入的数据对于 ng-show 这类 directive 都是可用的,就像是在本地 $scope 中的变量一样。

当然,全局变量是邪恶的,你必须很小心地使用 $rootScope。特别是不要用于代码,而仅仅用于注入数据。如果你非常希望在 $rootScope 写一个函数,那最好把它写到 service 里,这样只有用到的时候它才会被注入,测试起来也方便些。

相反,如果一个函数的功能仅仅是存储和返回一些数据,就不要把它创建成一个 service。

子作用域的原型继承问题

       辛酸泪,这个也是个大坑。作用域变量的继承是基于javascript原型继承机制的,在使用涉及到作用域的指令如ng-template,ion-modal等时需要特别注意,相关的查找顺序这里就不细说了。


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
JavaScript 프레임 워크 : 현대적인 웹 개발 파워JavaScript 프레임 워크 : 현대적인 웹 개발 파워May 02, 2025 am 12:04 AM

JavaScript 프레임 워크의 힘은 개발 단순화, 사용자 경험 및 응용 프로그램 성능을 향상시키는 데 있습니다. 프레임 워크를 선택할 때 : 1. 프로젝트 규모와 복잡성, 2. 팀 경험, 3. 생태계 및 커뮤니티 지원.

JavaScript, C 및 브라우저의 관계JavaScript, C 및 브라우저의 관계May 01, 2025 am 12:06 AM

서론 나는 당신이 이상하다는 것을 알고 있습니다. JavaScript, C 및 Browser는 정확히 무엇을해야합니까? 그들은 관련이없는 것처럼 보이지만 실제로는 현대 웹 개발에서 매우 중요한 역할을합니다. 오늘 우리는이 세 가지 사이의 밀접한 관계에 대해 논의 할 것입니다. 이 기사를 통해 브라우저에서 JavaScript가 어떻게 실행되는지, 브라우저 엔진의 C 역할 및 웹 페이지의 렌더링 및 상호 작용을 유도하기 위해 함께 작동하는 방법을 알게됩니다. 우리는 모두 JavaScript와 브라우저의 관계를 알고 있습니다. JavaScript는 프론트 엔드 개발의 핵심 언어입니다. 브라우저에서 직접 실행되므로 웹 페이지를 생생하고 흥미롭게 만듭니다. 왜 Javascr

Node.js는 TypeScript가있는 스트림입니다Node.js는 TypeScript가있는 스트림입니다Apr 30, 2025 am 08:22 AM

Node.js는 크림 덕분에 효율적인 I/O에서 탁월합니다. 스트림은 메모리 오버로드를 피하고 큰 파일, 네트워크 작업 및 실시간 애플리케이션을위한 메모리 과부하를 피하기 위해 데이터를 점차적으로 처리합니다. 스트림을 TypeScript의 유형 안전과 결합하면 Powe가 생성됩니다

Python vs. JavaScript : 성능 및 효율성 고려 사항Python vs. JavaScript : 성능 및 효율성 고려 사항Apr 30, 2025 am 12:08 AM

파이썬과 자바 스크립트 간의 성능과 효율성의 차이는 주로 다음과 같이 반영됩니다. 1) 해석 된 언어로서, 파이썬은 느리게 실행되지만 개발 효율이 높고 빠른 프로토 타입 개발에 적합합니다. 2) JavaScript는 브라우저의 단일 스레드로 제한되지만 멀티 스레딩 및 비동기 I/O는 Node.js의 성능을 향상시키는 데 사용될 수 있으며 실제 프로젝트에서는 이점이 있습니다.

JavaScript의 기원 : 구현 언어 탐색JavaScript의 기원 : 구현 언어 탐색Apr 29, 2025 am 12:51 AM

JavaScript는 1995 년에 시작하여 Brandon Ike에 의해 만들어졌으며 언어를 C로 실현했습니다. 1.C Language는 JavaScript의 고성능 및 시스템 수준 프로그래밍 기능을 제공합니다. 2. JavaScript의 메모리 관리 및 성능 최적화는 C 언어에 의존합니다. 3. C 언어의 크로스 플랫폼 기능은 자바 스크립트가 다른 운영 체제에서 효율적으로 실행하는 데 도움이됩니다.

무대 뒤에서 : 어떤 언어의 힘이 자바 스크립트입니까?무대 뒤에서 : 어떤 언어의 힘이 자바 스크립트입니까?Apr 28, 2025 am 12:01 AM

JavaScript는 브라우저 및 Node.js 환경에서 실행되며 JavaScript 엔진을 사용하여 코드를 구문 분석하고 실행합니다. 1) 구문 분석 단계에서 초록 구문 트리 (AST)를 생성합니다. 2) 컴파일 단계에서 AST를 바이트 코드 또는 기계 코드로 변환합니다. 3) 실행 단계에서 컴파일 된 코드를 실행하십시오.

파이썬과 자바 스크립트의 미래 : 트렌드와 예측파이썬과 자바 스크립트의 미래 : 트렌드와 예측Apr 27, 2025 am 12:21 AM

Python 및 JavaScript의 미래 추세에는 다음이 포함됩니다. 1. Python은 과학 컴퓨팅 분야에서의 위치를 ​​통합하고 AI, 2. JavaScript는 웹 기술의 개발을 촉진하고, 3. 교차 플랫폼 개발이 핫한 주제가되고 4. 성능 최적화가 중점을 둘 것입니다. 둘 다 해당 분야에서 응용 프로그램 시나리오를 계속 확장하고 성능이 더 많은 혁신을 일으킬 것입니다.

Python vs. JavaScript : 개발 환경 및 도구Python vs. JavaScript : 개발 환경 및 도구Apr 26, 2025 am 12:09 AM

개발 환경에서 Python과 JavaScript의 선택이 모두 중요합니다. 1) Python의 개발 환경에는 Pycharm, Jupyternotebook 및 Anaconda가 포함되어 있으며 데이터 과학 및 빠른 프로토 타이핑에 적합합니다. 2) JavaScript의 개발 환경에는 Node.js, VScode 및 Webpack이 포함되어 있으며 프론트 엔드 및 백엔드 개발에 적합합니다. 프로젝트 요구에 따라 올바른 도구를 선택하면 개발 효율성과 프로젝트 성공률이 향상 될 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

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

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

안전한 시험 브라우저

안전한 시험 브라우저

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

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

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

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기