English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
앵글러의 핵심 사고 방식은 모든 것을 데이터로 드라이브하는 것입니다. 다른 것들은 데이터의 확장입니다.
제이스크립트의 모든 것이 객체라는 사고 방식을 따라, 앵글러에서는 모든 것이 데이터라고 말할 수 있습니다.
关于项目构建
(1) requirejs以及Yeoman
在刚开始接触或使用Angular的时候,总会对类似问题感到疑惑,我实践的答案是无需使用requirejs或Yeoman。前者不使用,因为Angular本身有module的实现。后者是因为Angular的组织结构以及项目构建没有必要弄得如此复杂,可以手写或者在GitHub上pull一个seed项目。
(2) 如何组织项目结构
这个问题有点棘手,因为完全因人而异,因项目而异。个人推荐的是两种组织结构,一种按照代码功能,也就是controller都放在一个文件夹下,services都放在一个文件夹下。另一种则遵循所实现的功能,比如User就把对应的template,services,controller都放在User文件夹下。
两种都可以,从维护角度来看,第二种会更好一些。
(3) controller以及service的划分
在这里,controller通常就是一个页面一个controller,如果一个页面有公共部分,公共部分永远使用一个controller。对于service需要划分为两个部分,一个是与服务器交互数据的service,另一个是一些功能性common的内容,其中放置一些自己编写的可复用服务,类似于notify等。
至于service是否需要按照功能和模块进一步划分,这取决于项目。
(4) Angular插件以及库的使用
对于一个项目,所有东西都从网上拿现成的肯定不现实,但是所有东西都自己写就更不实际了。Angular的许多插件是由Angular团队开发出来或者由一些人用jQuery插件封装的。我对插件的观点很简单,如果能够满足需求就赶紧使用,不能满足就自己编写或者在已有插件上进行改进。
对于调试几个小时仍然无法解决的插件,听我的建议,放弃它吧。大多数插件都是一些UI插件,大可不必追求复杂,有时候简单的HTML控件也自有它简约的美。
如果你遇到Angular插件冲突,尤其是UI插件,大多数情况下需要放弃其中之一,比如angular。-ui와 Angular-strap.
使用技巧
正文从这里开始,我将列举我在使用Angular过程中使用的一些技巧,将按照场景一一列举。这里对于Angular的一些基础概念不会进行解释,本文是一些技巧性的内容,而不是基础教程。
(1) angular에서 "{{ }}"은 Python의 flask과 충돌합니다
Python의 flask에서 사용하는 템플릿에서 데이터 바인딩은 두 개의 "{" 대문자 괄호를 통해 이루어집니다. 이는 angular의 데이터 바인딩과 충돌합니다. 이를 해결하는 방법은 두 가지가 있습니다. 하나는 angular의 바인딩 표시를 수정하는 것이고, 다른 하나는 flask의 바인딩 표시를 수정하는 것입니다. 두 가지 방법 모두 제공합니다.
angular을 수정하다:
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
// 이 문장을 config에 추가하면 됩니다. route의 module에 추가하세요. 여기서는 기존 angular의 {{ }} 바인딩을 {[{ }]}} 바인딩으로 수정합니다.
flask을 수정하다:
class CustomFlask(Flask): jinja_options = Flask.jinja_options.copy() jinja_options.update(dict( block_start_string='{%', block_end_string='%}', variable_start_string='{#', variable_end_string='#}', comment_start_string='<#', comment_end_string='#>', )) app = CustomFlask(__name__, instance_path='/web')
여기서 저는 flask를 수정하는 것을 추천합니다. 왜냐하면 angular를 사용하면 클라이언트와 서버의 분리가 됩니다. flask의 jinjia 템플릿은 더 이상 필요하지 않으며, Angular의 바인딩 표시를 수정하면 다른 컨트롤과 라이브러리에 문제가 발생할 수 있습니다.
(2) URL에서 항상 기본적으로 '#'이 포함되도록 제거합니다
route를 설정할 때, HTML을 활성화합니다5모드.
angular.module('router', ['ngRoute']) .config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { $locationProvider.html5Mode(true); // } ]
(3) ng-click="expression" 및 유사한 명령어, expression에서 여러 표현식을 작성하는 방법은 무엇인가요?63;
예를 들어, 나는 ng-click에서2변수에 값을 할당하려면, ";" 구분자로 분리할 수 있습니다:
<a ng-click="obja=1;objb=2></a>
(4) $watch가 작동하지 않거나 한 번만 작동합니다
이러한 경우 일반적으로 문자나 숫자를 감지할 때 발생합니다, $scope.$watch("name",function(){}). 작동하지 않거나 한 번만 작동하면, 해결책은 $watch를 가능한 한 객체를 감지하는 것이며, 감지하려는 값을 객체에 추가하면 됩니다.
angular을 사용할 때-ui의 modal이 이렇게 나타납니다. 이유는 $scope의 상속 때문입니다. modal은 현재 페이지의 controller에서 다시 하나의 scope를 생성하는 것과 같기 때문에, 상대적인 값은 프로토타입 루프를 통해 검색할 수 없습니다. 해결책은 객체를 사용하여 프로토타입 루프를 통해 부모 자식 scope 간 데이터 갱신 바인딩을 실현해야 합니다.
(5) ng를 기대합니다-view의 내용이 전체 페이지로 표시됩니다
일반적으로 페이지에는 고정된 top-menu나 sidebar과 같은 고정되지 않는 부분, 그리고 매번 route가 변경될 때마다 ng-view의 template, 페이지가 전체적으로 표시되고 싶을 때, top-menu와 같은 고정된 부분.
이곳은 일반적으로 index.html과 ng-view가 표시하는 template.html, top-menu와 sidebar은 index.html에 위치하며, 그들의 표시/숨기기를 ng를 통해-if 변수를 바인딩합니다.
만약 페이지가 완전히 표시되고 사이드바 등을 표시하지 않도록 하려면, controller에서 $scope.$emit을 통해 메시지를 전달하고, index 페이지의 controller는 $scope.$on을 통해 메시지를 감지합니다. 메시지를 듣면 사이드바 표시를 제어하는 변수를 변경합니다.
service를 통해 전역 변수를 제어할 수도 있으며, 개인적으로 메시지 브로드캐스트 방식을 추천합니다.
(6) 반드시 ng를 사용하십시오-if ng 대신-show
이는 angular의 작은 문제점입니다. 또는 작지 않고 큰 문제점입니다. 일부 긴 목록 데이터는 기본적으로 숨겨져 있고 클릭하면 표시되는 형태로 표시될 수 있습니다. 이 부분의 보이지 않는 내용도 많은 데이터 바인딩을 동반합니다. 이는 페이지 렌더링 시 성능에 크게 영향을 미칩니다.
예를 들어, 일반적으로 angular은 페이지의 데이터 바인딩을 최대로2000개의, 현재 페이지가 직접 바인딩된 경우2000개의 모델을 로드하면 매우 느리게 느껴질 것입니다. 만약에 매100의 model을 ng에 설정합니다-show를 사용하면 기본적으로 표시되지 않지만, 여전히 느리게 느껴집니다.
그런 다음 모든 ng-show를 ng로 변경하면-if을 사용하면 성능이 갑자기 두 개의 애플리케이션처럼 빠르게 느껴집니다. 원인은 ng-show는 여전히 모든 바인딩을 실행합니다, ng-if는 true와 같이, 즉 표시될 때까지 실행되지 않습니다. 이렇게 하면 성능이 크게 향상됩니다. 저는 이 간단한 수정을 통해 페이지 로드 속도가 빨라졌습니다10배 이상입니다.
따라서 ng를 사용할 수 있는 경우에만-if의 경우, 모든 ng를 이를 대신 사용합니다.-show와 ng-hide를 사용합니다.
(7) ng에 대해-bind-html
일반적으로 html 요소에 데이터를 바인딩하는 경우 ng-bind만으로도 충분하지만, 일부 상황에서는 일반 데이터가 아니라 html을 바인딩해야 할 수 있습니다. 그런 경우 ng-bind만으로는 충분하지 않아 ng-bind-html을 사용하면 내용이 html 형식으로 출력됩니다. 예를 들어 class를 포함한 html을 출력하려면 ng-bind-html에서도 사용하며, 또한 ngSanitize와의 협력이 필요하며, 필요한 파일을 포함해야 합니다.
(8) ng를 가져옵니다-repeat 데이터가 filter된 결과
이는 일반적으로 검색 시 사용되며, 예를 들어 다중 ng-repeat 데이터를 목록으로 형성한 후, 필터 한 필드를 통해 filter된 결과를 얻으려면,2이 방법.
한 가지는 html의 ng-repeat에서 이렇게 작성됩니다:
ng-repeat="food in foodCategory._displayfoods = (foodCategory.foods | filter: { 'name': searchobj.foodfilter } | orderBy: food.sort_order)"
이렇게 _displayfoods는 filter된 최종 표시 결과입니다. 다른 방법은 두套 데이터를 사용하여, 하나는 controller에 작성되고, filter 및 orderBy는 controller에서 처리되며, 최종 결과는 ng-repeat.
첫 번째 방법이 더 편리하고, 두 번째 방법은 더 좋으며 성능도 좋습니다.
(9) ng-class 및 ng-style은 조건을 통해 할당됩니다
변수의 값에 따라 특정 class를 적용하거나 다른 style 스타일을 결정합니다.
ng-class="{'state-error':!foodForm.foodstock.$valid}"
ng-style="{ color: i.color=='' || i.name=='活' ? 'default' : '#fff' }"
(10) form 검증을 input 예로 들어 설명합니다.
angular의 form은 input의 HTML5속성을 검증하십시오. 여기서는 주로 form 및 input의 name 속성을 사용하여 잠금을 설정합니다. formname.inputname.$valid는 inputname 이름의 공간이 자신의 속성 검증을 통과했는지를 나타냅니다.
(11) $resource와 $http의 $promise
$q.all([ resource.query().$promise, resource2.query().$promise ]).then(functon(success){ console.log(success); },functon(error){ console.log(error); }); foodFactory.food.save(f).$promise.then(function(result){ foodFactory.food.get({id:result.id}).$promise.then(function(data){ }); });
이는 설명이 필요 없습니다. 바로 보시면 됩니다. $http의 promise는 수동으로 반환되어야 하므로 일반적으로 $resource를 사용합니다.
(12) 단순히 collection의 한 속성을 $watch로 모니터링
$watch의 세 번째 파라미터를 true로 설정하면 deep watch를 할 수 있습니다. 하지만 때로는 전체 collection의 속성을 모니터링하고 싶지 않거나 필요하지 않을 때도 있습니다. 그럴 때는 단순히 for 루프를 사용하여 $watch를 돌리는 것보다 훨씬 더 나은 방법이 있습니다.
이렇게 쓰면 collection의 단일 object 속성을 모니터링할 수 있습니다.
$scope.people = [ { "groupname": "g"1", "persions": [ { "id": 1, "name": "bill" }, { "id": 2, "name": "bill"2" } ] }, { "groupname": "g"2", "persions": [ { "id": 3, "name": "bill"3" }, { "id": 4, "name": "bill"4" } ] } ] $scope.$watch(function($scope) { return $scope.people.map(function(obj) { return obj.persions.map(function(g){ return g.name }); }); }, function (newVal) { $scope.count++; $scope.msg = 'person name was changed'+ $scope.count; }, true);
(13) debounce 디버프 처리
이는 자주 발생하는 처리에 매우 유용하며, ng와 유사한 경우에 적용됩니다.-change,$watch의 일부 상황에 대해 설명합니다. 예를 들어, 키워드에 따라 실시간으로 검색하는 경우, $debounce를 서비스로 패키징하여 직접 인터페이스를 호출합니다. 코드: http://jsfiddle.net/Warspawn/6K7Kd/
(14)로 빠르게 특정 위치로 이동할 수 있습니다
일반적으로 페이지 내에서 <a id="bottom"></a>와 같은 형식으로 js 코드를 결합하여 빠르게 위치를 찾을 수 있습니다. angular에서도 유사한 원리로 구현됩니다. 코드는 다음과 같습니다:
var old = $location.hash(); $location.hash('batchmenu-bottom'); $anchorScroll(); $location.hash(old);
이렇게 쓰는 이유는 직접 location.hash를 사용하면 URL이 변경되고 페이지가 이동하는 것을 방지하기 위해 코드를 추가했기 때문입니다.
현재는 이렇게 정리했습니다. 많은 것들은 자료 검색 및 자신의 실제 경험에서 나왔습니다. 필요한 TX에게 도움이 되길 바랍니다. 앞으로 새로운 것들이 생기면 계속 작성할 계획입니다.
이것이 Angular 애플리케이션 기술의 요약입니다. 이어서 관련 기사를 추가하여 정리할 계획입니다. 감사합니다!
선언: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자에게 소유되며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집을하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 위반 내용을 발견하면, 이메일을 notice#w로 보내 주세요!3codebox.com에 이메일을 보내면 (#을 @으로 변경하십시오) 신고를 하고, 관련 증거를 제공하십시오. 확인되면, 이 사이트는 즉시 위반 내용을 삭제합니다.