Статьи

Создание HTML-элемента Solr Search с AngularJS

В последнее время мы играли с EmberJS, чтобы собрать приятные клиентские приложения. Но меня беспокоит то, насколько тяжелым он кажется. Меня также беспокоит то, что AngularJS действительно привлекает много внимания, и я хочу убедиться, что я не скучаю по лодке! Вот, посмотрите, просто посмотрите на график Google Trends emberjs / angularjs:

Снимок экрана 2013-08-11 в 5.55.23 вечера

Так как все мои основные жизненные решения продиктованы графиками 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, чтобы восстановить мерцание!