В последнее время мы играли с EmberJS, чтобы собрать приятные клиентские приложения. Но меня беспокоит то, насколько тяжелым он кажется. Меня также беспокоит то, что AngularJS действительно привлекает много внимания, и я хочу убедиться, что я не скучаю по лодке! Вот, посмотрите, просто посмотрите на график Google Trends emberjs / angularjs:
Так как все мои основные жизненные решения продиктованы графиками Google Trends, на этих выходных я потратил немного времени, чтобы ознакомиться с AngularJS. И, честно говоря, я впечатлен!
При создании JavaScript-фреймворка проектировщик фреймворка должен найти тонкий баланс между мощью и весом (то есть, насколько навязчивым и тяжелым является фреймворк). Обычно, чем мощнее фреймворк, тем больше вы инвестируете в фреймворк, тем труднее его изучать, и тем больше вам просто нужно принять его мнение как правильный путь (даже если вы тайно не согласны ). AngularJS, каким-то чудесным образом, кажется одновременно и мощным, и легким! После случайной прогулки по главной странице сайта AngularJS я сразу же смог начать работать с ним.
В настоящее время одной из моих любимых особенностей AngularJS является возможность создавать свои собственные HTML-теги. Например, в создаваемом мной прототипе я просто использовал AngularJS для создания нового <lawsearch>
элемента, который загружает набор результатов поиска и отображает их на странице. Давайте посмотрим, как это работает.
Сначала я создаю код, который определяет этот новый элемент, включает привязку данных и управляет их поведением (обязательно прочитайте комментарии здесь):
//define a module (yay! modular code!) angular.module('law', []) //within that module, define the idea of a lawsearch element directive('lawsearch', function () { return { restrict: 'E', // this indicates that we're describing a new element scope: {}, //every element will have its own scope //this is where the behavior is defined controller: function ($scope, $element) { $scope.init = function (q) { $scope.q = q; //here we issue the actual query using jQuery $.ajax({ url: "http://ec2-75-101-214-153.compute-1.amazonaws.com:8983/solr/statedecoded/search", data: { "q": $scope.q, "wt": "json", "rows":3 }, traditional: true, cache: true, async: true, dataType: 'jsonp', success: function (data) { //and when we get the query back we //stick the results in the scope $scope.$apply(function () { $scope.results = data.response.docs; }); }, jsonp: 'json.wrf' }); } }, //finally, here's the presentation our new lawsearch element template: '<div>'+ ' <h1>{{q}}</h1>'+ ' <ul class="unstyled">'+ //check out how easy it is to iterate through elements ' <li ng-repeat="result in results">'+ ' <h4>{{result.catch_line}}</h4>'+ ' <p>{{result.text}}</p>'+ ' </li>'+ ' </ul>'+ '</div>', replace: true }; })
Мне нравится, что AngularJS полностью прибил паттерн модель-представление-контроллер. Обычно, когда кто-то говорит, что использует основанную на MVC инфраструктуру, мне нравится спрашивать его, что это значит и как их среда соответствует шаблону MVC. Я предполагаю, что я садист, но мне нравится слышать, как они бормочут и брызгают, когда они пытаются ответить на вопрос.
Но здесь AngularJS прояснил это. Модель представляет собой данные , которые скрываются за элементом lawsearch (это данные , которые мы храним толкая в объект $ области видимости), вид шаблона , который описывает , как будет представлена данные и контроллер функция (помеченный «контроллер Выше), который выступает в качестве посредника между моделью и представлением. Когда модель изменяется, контроллер передает необходимую информацию представлению, а когда пользователи взаимодействуют с представлением, контроллер может передавать изменения обратно в модель. Я люблю это.
Теперь, когда часть JavaScript готова, давайте посмотрим, как можно использовать это (опять же, прочитайте комментарии здесь):
<html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Law Search</title> <script type="text/javascript" src="//code.jquery.com/jquery-2.0.2.js"></script> <!-- We've got to include angular... duh... --> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> </head> <body ng-app="law"><!-- this extra bit indicates that the law module is in charge of everythin in this tag --> <!-- and then we just create several searches! the init calls code in the controller --> <lawsearch ng-init="init('vehicle')"></lawsearch> <lawsearch ng-init="init('house')"></lawsearch> <lawsearch ng-init="init('pet')"></lawsearch> </body> </html>
Трудно стать намного проще, чем это. Хотите увидеть это в действии? Вот оно, живи .
И … если вы не находите это впечатляющим, вам обязательно понравится это: я использовал AngularJS, чтобы восстановить мерцание!