Имам обект от потоци от съобщения, който изглежда така:
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}}
render_message:
<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).