Опубликован: 15.05.2013 | Доступ: свободный | Студентов: 265 / 9 | Длительность: 24:25:00
Специальности: Системный архитектор
Лекция 2:

Поиск

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Предоставление вариантов запроса

Использование querysubmitted и последовательности активации в предыдущем разделе дает вам базовый уровень поискового взаимодействия, и Windows автоматически предоставляет истоию поиска пользователя. Однако, выполнив некоторые дополнительные действия, вы можете сделать поисковый опыт взаимодействия пользователя и системы богаче. Так как написание кода, который выполняет поиск, обработка результатов и их представление – это, в любом случае, основная работа с контрактом Поиск, добавление поддержки предложения вариантов запроса (в этом разделе) и вариантов результатов (в следующем), это сравнительно маленькое вложение в серьезное увеличение качества опыта взаимодействия пользователя и системы.

Для того, чтобы выйти за пределы поисковой истории и предлагать пользователю варианты запросов когда он вводит запрос, что выглядит для пользователя как то, что показано в левой части рис. 2.2, вы можете использовать два параметра. Какой из них использовать, зависит от того, что вы хотите предложить, и от данных, по которым осуществляется поиск.

Во-первых, для предоставления предложений вариантов из папок файловой системы, по которым осуществляется поиск, таким, как библиотеки музыки, изображений и видео, панель поиска предоставляет встроенную реализацию посредством ее метода setLocalContentSuggestionsSettings (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.setlocalcontentsuggestionsettings.aspx ), что приводит к результатам, похожим на показанные на рис. 2.2. Как показано в Сценарии 4 примера, сначала создают объект Windows.ApplicationModel.Search.LocalContentSuggestionSettings (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.localcontentsuggestionsettings.aspx ), заполняют его свойства и передают его setLocalContentSuggestionsSettings (js/scenario4.js):

var page = WinJS.UI.Pages.define("/html/scenario4.html", {
ready: function (element, options) {
var localSuggestionSettings = new
Windows.ApplicationModel.Search.LocalContentSuggestionSettings();
localSuggestionSettings.enabled = true;
localSuggestionSettings.locations.append(Windows.Storage.KnownFolders.musicLibrary);
localSuggestionSettings.aqsFilter = "kind:=music";
Windows.ApplicationModel.Search.SearchPane.getForCurrentView()
.setLocalContentSuggestionSettings(localSuggestionSettings);
}
});
      
 Предложения вариантов из локальных папок, автоматически предоставляемое панелью поиска

Рис. 2.4. Предложения вариантов из локальных папок, автоматически предоставляемое панелью поиска

При заполнении свойств LocalContentSuggestionSettings , убедитесь, для начала, в том, что установили enabled в true. Коллекция locations (вектор) содержит один или большее количество объектов StorageFolder, которые показывают, где должен осуществляться поиск. Так как перечисление файлов для предоставления предложений требует программного доступа к этим папкам, вы должны убедиться в том, что в манифесте приложения сделаны соответствующие объявления, получить эти папки из AccessCache, или получить программный доступ к ним с помощью средства выбора файлов. В последнем случае приложение может предоставить пользовательский интерфейс для настройки мест поиска (возможно, например, в панели параметров).

Вы так же можете задать строку Advanced Query Syntax (AQS) (http://msdn.microsoft.com/library/windows/apps/aa965711.aspx ) в свойстве aqsFilter, и/или некоторое количество свойств Windows (http://msdn.microsoft.com/library/windows/desktop/dd561977%28v=vs.85%29.aspx ) (наподобие System.Title) в propertiesToMatch (строковый вектор). Это обычно используется для фильтрации по типам файлов, как при поиске в папке, но здесь вы можете задать все, что нужно. Для того, чтобы узнать больше об AQS, обратитесь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", больше о свойствах Windows вы можете узнать в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".

Что касается второй возможности, LocalContentSuggestionSettings может многое сделать для вас, при работе с локальными данными, но обычно приложения выполняют поиск и по другим источникам данных (либо по локальным, либо по онлайновым), и, таким образом, нуждаются в предоставлении предложений из этих источников. В подобных случаях можно прослушивать и обрабатывать событие панели поиска suggestionsrequested. Его eventArgs (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpanesuggestionsrequestedeventargs.aspx ) будет содержать, как обычно, свойства queryText, language, и linquisticDetails, и в ответе на событие вы заполняете коллекцию, содержащую до пяти придложений в eventArgs.request.searchSuggestionCollection (опять же, при необходимости включая альтернативы в объекте linguisticDetails). В идеале все это занимает полсекунды или меньше, и важно знать, что все необходимые результаты должны присутствовать в коллекции как только вы вернетесь из обработчика события.

Вот, как это реализованов Сценарии 2 примера реализации поискового контракта (здесь suggestionList – это заданный в коде список названий городов):

Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;
var query = queryText.toLowerCase();
var maxNumberOfSuggestions = 5;
for (var i = 0, len = suggestionList.length; i < len; i++) {
if (suggestionList[i].substr(0, query.length).toLowerCase() === query) {
suggestionRequest.searchSuggestionCollection.appendQuerySuggestion(
suggestionList[i]);
if (suggestionRequest.searchSuggestionCollection.size ===
maxNumberOfSuggestions) {
break;
}
}
}
};

Таким образом, если в query содержится "ba", как на рис. 2.2., первые пять названий в suggestionList будут Bangkok, Bangalore, Baghdad, Baltimore, и Bakersfield. Конечно, реальное приложение будет брать предложения из собственной базы данных или с какого-либо сервиса (это сымитировано в Сценариях 5 и 6, кстати), но идея у вас есть. Хотя, в случае с сервисом, вам следует так же проверить свойство suggestionResult.isCanceled прежде чем начинать новый запрос: этот флаг показывает, что поисковый запрос не изменился по сравнению с предыдущим запросом, и, значит, нет необходимости заполнять список предложений.

Примечание. Когда свойство SearchPane.searchHistoryEnabled установлено в true (по умолчанию), автоматически отслеживается история поиска пользователя и основные поисковые запросы отображаются при запуске интерфейса чудо-кнопки Поиск (прежде чем пользователь начнет вводить поисковый запрос). Установка этого свойства в false открючит такое поведение и в таком случае приложение сможет поддерживать собственную историю предыдущих значений queryText. Если приложение это делает, мы рекомендуем предоставлять в панели настроек приложения средства для очистки истории.

Так же приложения могут использовать свойство SearchPane.searchHistoryContext для создания различных наборов исторических данных поиска, зависящих от контекста. Когда это значение установлено до запуска интерфейса поиска, автоматически управляемые поисковые запросы (searchHistoryEnabled установлено в true) будут сохранены для этого контекста. Это не оказывает влияния, если приложение само поддерживает историю, в таком случае оно может самостоятельно поддерживать различные списки исторических данных по запросам.

Свойство eventArgs.request объекта SearchPaneSuggestionsRequest (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpanesuggestionsrequest.aspx ), имеет несколько возможностей, о которых полезно знать. Его свойство searchSuggestedCollection уникально – это не массив или другой обычный вектор, а объект типа SearchSuggestionCollection (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchsuggestioncollection.aspx ) со свойством size и четырьмя методами: appendQuerySuggestion (для добавления в список отдельного элемента, как показано выше), appendQuerySuggestions (для добавления массива элементов, который вы можете получить из запроса к сервису), appendResultSuggestion (смотрите следующий раздел) и appendSearchSeparator (который используется для группировки предложений). В последнем случае, разделителю задается подпись, как показано ниже:


У объекта запроса так же есть метод getDeferral, который используется, если для получения предложений выполнить асинхронную операцию. Это работает как и прочие отложенные механизмы, которые мы уже видели: перед запуском асинхронной операции (наподобие WinJS.xhr), вызывается getDeferral для получения отложенного объекта, начинается операция, осуществляется возврат из метода suggestionsrequested, и вызывается метод отложенного объекта complete внутри асинхронного обработчика завершения. Это показано в Сценариях 5 и 6 примера, так как это, очевидно, необходимо при запрашивании данных с сервиса для этой цели (код взят из sj/scenario5.js):

Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;

var deferral = suggestionRequest.getDeferral();

// Создает запрос для получения предложений из сервиса и предоставляет их панели поиска.
// В зависимости от устройства сервиса, вы можете использовать различные URL, основанные на eventObject.language.
// Так же вы можете составить queryText в URL для того, чтобы позволить сервису выполнить фильтрацию.
xhrRequest = WinJS.xhr({ url: /* URL к сервису с предложениями вариантов */ });
xhrRequest.done(
function (request) {
if (request.responseText /* или responseXML */) {
// Заполняет suggestionRequest.searchSuggestionCollection на основе ответа
}

deferral.complete(); // Показывае, что мы успешно получили предложения.
},
function (error) {
// Вызывает complete отложенного объекта при возникновении ошибки.
deferral.complete();
});
};
      

Вы можете использовать любые необходимые форматы ответов JSON или XML, но так как ваше приложение выполняет их разбор, существуют стандарты на возвращаемые поисковые предложения. Для JSON, обратитесь к "OpenSearch Suggestions specification" (http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.1 ) и к Сценарию 5, где JSON-ответ может быть напрямую преобразован в массив и передан в одном вызове appendQuerySuggestions. В случае с XML обратитесь "XML Search suggestions Format Specification" (http://msdn.microsoft.com/library/cc891508.aspx ) и к Сценарию 6. В последнем случае, функция generateSuggestions представляет стандартное средство для разбора подобного ответа, и, хотя в примере не показано использование разделителей, URI и изображений в подобных ответах, функция generateSuggestions показывает, как обрабатывать их и отправлять в appendQuerySuggestion[s] , как и в appendResultSuggestion, которую мы сейчас рассмотрим.

Другими словами, обработка события querysubmitted подразумевает, что вы возьмете текст запроса и заполните список результатов на вашей собственной странице. Поэтому вы нарямую обрабатываете события щелчка или прикосновения к этим элементам, перемещаясь к соответствующей странице с подробной информацией. Событие resultSuggestionChosen сообщает вам о том, что то же самое произошло на системной панели приложения, на которой отображены предложенные вами данные. Таким образом, вы обрабатываете событие resultSuggestionChosen так же, как вы обрабатывали бы активацию элемента на вашей собственной странице. Свойство eventArgs.tag в данном случае будет содержать тег, который вы предоставили для предложенного результата в вызове appendResultSuggestion.

Этот метод принимает пять аргументов в следующем порядке, здесь нужно позаботиться о локализации:

  • text – первая строка текста для показа в панели поиска (как на рис. 2.2).
  • detailText – вторая строка текста для результата поиска (как на рис. 2.2), которая так же используется как текст всплывающей подсказки.
  • tag – строка, которые вы хотите получить в событии resultSuggestionChosen.
  • image – объект IRandomAccessStreamReference (http://msdn.microsoft.com/library/windows/apps/windows.storage.streams.irandomaccessstreamreference.aspx ), содержащий изображение для отображения в интерфейсе. Базовый размер этого изображения 40x40 для 100% масштаба, 56x56 для 140%, и 72x72 для 180%. Принимайте во внимание эти размеры, если вы динамически генерируете изображения для предложений результатов поиска.
  • imageAlternateText – атрибут alt для изображения.

Как отмечено в предыдущем разделе, функция generateSuggestions из Сценария 6 примера предоставляет стандартный обработчик, который переводит предложения результатов поиска из формата XML в вызов appendResultSuggestion, включая использование Windows.Storage.Streams.RandomAccessStreamReference.createFromUri для преобразования URI изображения в соответствующее описание потока. Обычно подобные URI указывают на удаленный ресурс, который, в идеале, должен позволить вам запрашивать изображения различных размеров на основании масштабирования разрешения.

Локальные URI ms-appx:// и ms-appdata:// так же можно использовать с использованием соответствующего соглашения о формате имен .scale-1x0. Вам, фактически, всегда следует иметь в пакете изображения по умолчанию для предлагаемых результатов поиска (используя URI ms-appx:// для обращения к ним при необходимости). Система не будет предоставлять их вам автоматически.

Ввод для поиска

Последняя особенность поиска заключается в возможности имитировать поведение "ввод для поиска" Начального экрана Windows, когда пользователь не выполняет явную активацию чудо-кнопки Поиск. Если вы не делали этого раньше и у вас есть компьютер, оснащенный физической клавиатурой, нажмите на клавишу Windows для того, чтобы попасть на Начальный экран и начните вводить название какого-нибудь приложения не открывая интерфейс чудо-кнопки Поиск. Вуаля! Панель поиска появилась автоматически, с уже отфильтрованными и отображенными результатами. Это такое же поведение, которым отличалась кнопка Пуск в предыдущих версиях Windows, но сейчас все это выглядит гораздо привлекательнее!

Для того, чтобы включить подобную возможность для своего приложения, просто установите свойство SearchPane.showOnKeyboardInput (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.showonkeyboardinput.aspx ) в значение true. С помощью этого свойства вы можете в любой момент включать и выключать эту возможность. Вообще говоря, мы рекомендуем предоставлять такую модель поведения на главной странице (страницах) вашего приложения и на странице вывода результатов поиска, но не на других вспомогательных страницах, где могут быть другие элементы управления для ввода данных, не на страницах подробной информации, отображающих содержимое для отдельного элемента, не на страницах, имеющих функцию поиска по содержимому страницы. Подробности вы можете найти в материале "Руководство и конрольный список для поиска" (http://msdn.microsoft.com/library/windows/apps/hh465233.aspx#user_experience_guidelines__enabling_type_to_search ).

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >