Столбцы Миллера описывают дизайн пользовательского интерфейса для просмотра и редактирования иерархических списков . Некоторые известные реализации включают:
Есть ряд проблем с этими реализациями.
Демо и код . Это почти идеально, главная проблема в том, что иерархию нельзя настроить заранее. В идеале код JSON будет выглядеть так:
{ 'id': 'ID1', 'name': 'Name2', 'parent': false },
{ 'id': 'ID2', 'name': 'Name2', 'parent': 'ID1' },
Где второй элемент («ID2») ссылается на свой родительский идентификатор («ID1»). К сожалению, 'parent'
параметр принимает логическое значение, чтобы указать, существует ли родитель. Это означает, что использование библиотеки требует регистрации событий и реализации данных иерархии в виде отдельных файлов (запросов), насколько я могу судить.
Демо и код . Кажется, есть некоторые серьезные ошибки (например, щелчок по категории без дочерних элементов приводит к появлению дочернего элемента в следующем столбце). Нет хуков для операций создания/обновления/удаления.
Демо и код . Проблем предостаточно: неудобный пользовательский интерфейс (навигация с помощью клавиатуры с использованием фокуса поля ввода), отсутствие структуры в макете с несколькими столбцами, большое количество файлов библиотеки JS для включения, отсутствие перехватчиков для операций создания/обновления/удаления.
Другие реализации, которые обременены проблемами:
Какая библиотека JavaScript соответствует следующим критериям:
Подойдет Vanilla JS, jQuery, MooTools или Closure.
После долгих поисков подходящей простой программы Miller Columns не нашлось. Вот мое программное обеспечение с указанной функциональностью:
Операции редактирования одинаково тривиальны:
$(document).ready( function() {
$.getScript( "js/columns.js", function() {
var $current;
$("div.columns").millerColumns({
current: function( $item ) {
$current = $item;
}
});
/** Called when an edit link is clicked. */
update = function( link, def, undef ) {
$(link).on( "click", function( event ) {
event.preventDefault();
($current === undefined) ?
typeof undef === "function" && undef() :
typeof def === "function" && def();
return false;
});
}
update( "#new",
function() {
console.log( "new child of: " + $current );
},
function() {
console.log( "new root sibling" );
}
);
update( "#edit",
function() {
console.log( "edit" );
}
);
update( "#del",
function() {
console.log( "delete" );
}
);
});
});