我有一个消息流对象,如下所示:
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 ]}}
渲染消息流:
{{#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 元素重用,这会触发很多错误的动画。(例如,如果stream1 比stream2 多一条消息,它会触发流中最后一条消息的介绍/结尾动画)。