У меня есть объект потоков сообщений, который выглядит так:
ractive.data.messages:
{
stream_id1: {
some_stream_metadata: "foo",
stream: [
{id: "someid1", message: "message1"},
{id: "someid2", message: "message2"}
]
},
stream_id2: {
some_stream_metadata: "bar",
stream: [
{id: "someid3", message: "message3"},
{id: "someid4", message: "message4"}
]
}
}
основной_шаблон:
{{#messages[ current_stream_id ]}}
{{>render_message_stream}}
{{/messages[ current_stream_id ]}}
render_message_stream:
{{#stream}}
<div class="stream">
...someotherstuff...
{{>render_message}}
</div>
{{/stream}}
рендер_сообщение:
<div class="message">
...someotherstuff...
{{message}}
</div>
Я меняю «current_stream_id», чтобы изменить отображаемый поток сообщений.
При обновлениях я меняю содержимое потоков сообщений следующим образом:
ractive.merge(
"messages.stream_id1.stream",
new_message_stream,
{
compare: function ( item ) { return item.id; }
});
Я также попробовал параметр compare: true вместо функции с теми же результатами:
Ractive всегда считает, что эти два сообщения принадлежат одному и тому же элементу DOM, даже если они находятся в совершенно другом потоке сообщений:
ractive.data.messages[ "stream_id1" ].stream[1].message
ractive.data.messages[ "stream_id2" ].stream[1].message
Проблемы:
Когда есть анимация вступления / завершения, ractive всегда анимирует только конец потока сообщений, даже если сообщение в середине потока было удалено, мне нужна помощь, чтобы заставить ractive понять, какие сообщения идентичны.
Когда я меняю current_stream_id, ractive не выполняет повторную визуализацию полного фрагмента {{>render_message_stream}}, а переходит внутрь существующего dom и изменяет поле {{message}} во всех существующих сообщениях, хотя это может быть полезно для повторного использования элемента dom, это вызывает много неправильных анимаций. (Например, он запускает анимацию вступления/конца для последнего сообщения в потоке, если в потоке 1 на одно сообщение больше, чем в потоке 2).