У меня есть список объектов (файлов каталогов). Затем пользователь может выбрать порядок сортировки (имя, дата и т. д.) и добавить дополнительные элементы.
После сортировки наблюдатель правильно обновляет данные, и пользовательский тег обновляется. Однако, когда я добавляю новые элементы, пользовательский тег не получает тот же триггер обновления.
Мой собственный тег {{sort}}
в основном делает следующее:
- Зацикливает и преобразует список объектов в массив (для возможности упорядочения).
- Сортирует массив по предоставленному индексу (имя и т. д.).
- Зацикливает и создает HTML-код рендеринга.
Мои данные:
{
'file1-id' : { name : 'file.txt', date : 1470123456 },
...
}
Мой HTML:
{^{sort prop.items ~root.sort.index ~root.sort.direction}}
{^{:item.name}}
{{/sort}}
Мой JS:
$.views.tags({
/**
* @usage {^{sort items keyname desc}} {{:i}}{{:key}}{^{:item.property}} {{/sort}}
*
* @param mixed $items An Object of Items to Loop & Render.
* @param string $index The Name of the Item Key to Order by (name|date|size.x).
* @param string $direction The Direction to Order by (asc = old -> new, desc = new -> old).
*/
sort : function( items, index, direction )
{
var results = [];
var segments = index.split( '.' );
var deep = segments.length > 1; // Check whether a nested index ( e.g. size.x)
// Render Each Item to an Array
$.each( items, $.proxy( function( key, el )
{
// Skip jQuery Observer Event Items Which are in the List (jQuery12313847623846)
if( !el.data || !el.events )
{
var keyval = null;
// Search for nested index
if( deep && el.hasOwnProperty( segments[0] ) && el[segments[0]].hasOwnProperty( segments[1] ) )
{
var keyval = el[segments[0]][segments[1]];
}
else if( el.hasOwnProperty( segments[0] ) )
{
var keyval = el[segments[0]];
}//end if
// Keep Hold of Keys for Sorting
results.push(
{
key : keyval,
item : el
});
}//end if
}, this ) );
// Sort Items
if( segments[0] )
{
results = results.sort( function( a, b )
{
if( direction == 'asc' )
{
return a.key > b.key ? 1 : -1;
}
else
{
return a.key < b.key ? 1 : -1;
}//end if
});
}//end if
// Traverse, Render Item HTML, Implode & Return
return $.map( results, $.proxy( function( el, i )
{
return this.tagCtx.render( { i : i, key : el.key, items : results, item : el.item } );
}, this ) ).join( "\n" );
},
});
Преобразование объекта в массив теряет наблюдаемость или проблема заключается в чем-то другом?
Я просмотрел документы, но не смог найти ни одного сценария, похожего на мой, кроме контроль диапазона.
Я ограничен следующим:
- Данные представляют собой список объектов и могут быть массивом объектов.
- JSViews v1.0.0-alpha 52 (знаю, не последняя!).
Я попытался использовать свойства тега для восстановления наблюдаемости, например:
boundProps : ['items', 'index', 'direction'],
dataBoundOnly : true,
autoBind : true,
Это упрощенный пример. Если ошибка изначально не очевидна, я попытаюсь сделать скрипку. Любые указатели будут очень признательны!
Спасибо!