Patch Mithril bug causing redraws to fail

Turns out there's a little more to the regression in e5a7013. First, we need to give the spaces in between list items a key too. Second, there's a bug in the latest Mithril code where using string keys can break the diffing algorithm. I've patched it manually in our dist JS files for now, and reported the issue: https://github.com/lhorie/mithril.js/issues/934
This commit is contained in:
Toby Zerner
2016-01-19 18:55:57 +10:30
parent 60d78cedef
commit 3cec7e8b46
3 changed files with 20 additions and 12 deletions

12
js/admin/dist/app.js vendored
View File

@ -1051,11 +1051,9 @@ var m = (function app(window, undefined) {
function checkView(data, view, cached, cachedControllers, controllers, views) { function checkView(data, view, cached, cachedControllers, controllers, views) {
var controller = getController(cached.views, view, cachedControllers, data.controller); var controller = getController(cached.views, view, cachedControllers, data.controller);
//Faster to coerce to number and check for NaN
var key = +(data && data.attrs && data.attrs.key);
data = pendingRequests === 0 || forcing || cachedControllers && cachedControllers.indexOf(controller) > -1 ? data.view(controller) : {tag: "placeholder"}; data = pendingRequests === 0 || forcing || cachedControllers && cachedControllers.indexOf(controller) > -1 ? data.view(controller) : {tag: "placeholder"};
if (data.subtree === "retain") return data; if (data.subtree === "retain") return data;
if (key === key) (data.attrs = data.attrs || {}).key = key; (data.attrs = data.attrs || {}).key = key;
updateLists(views, controllers, view, controller); updateLists(views, controllers, view, controller);
return data; return data;
} }
@ -20671,15 +20669,19 @@ System.register('flarum/helpers/listItems', ['flarum/components/Separator', 'fla
var className = item.props ? item.props.itemClassName : item.itemClassName; var className = item.props ? item.props.itemClassName : item.itemClassName;
if (isListItem) { if (isListItem) {
item.props.key = item.itemName; item.attrs = item.attrs || {};
item.attrs.key = item.attrs.key || item.itemName;
} }
var space = new String(' ');
space.attrs = { key: '_space_' + item.itemName };
return [isListItem ? item : m( return [isListItem ? item : m(
'li', 'li',
{ className: classList([item.itemName ? 'item-' + item.itemName : '', className, active ? 'active' : '']), { className: classList([item.itemName ? 'item-' + item.itemName : '', className, active ? 'active' : '']),
key: item.itemName }, key: item.itemName },
item item
), ' ']; ), space];
}); });
} }

12
js/forum/dist/app.js vendored
View File

@ -1051,11 +1051,9 @@ var m = (function app(window, undefined) {
function checkView(data, view, cached, cachedControllers, controllers, views) { function checkView(data, view, cached, cachedControllers, controllers, views) {
var controller = getController(cached.views, view, cachedControllers, data.controller); var controller = getController(cached.views, view, cachedControllers, data.controller);
//Faster to coerce to number and check for NaN
var key = +(data && data.attrs && data.attrs.key);
data = pendingRequests === 0 || forcing || cachedControllers && cachedControllers.indexOf(controller) > -1 ? data.view(controller) : {tag: "placeholder"}; data = pendingRequests === 0 || forcing || cachedControllers && cachedControllers.indexOf(controller) > -1 ? data.view(controller) : {tag: "placeholder"};
if (data.subtree === "retain") return data; if (data.subtree === "retain") return data;
if (key === key) (data.attrs = data.attrs || {}).key = key; (data.attrs = data.attrs || {}).key = key;
updateLists(views, controllers, view, controller); updateLists(views, controllers, view, controller);
return data; return data;
} }
@ -29793,15 +29791,19 @@ System.register('flarum/helpers/listItems', ['flarum/components/Separator', 'fla
var className = item.props ? item.props.itemClassName : item.itemClassName; var className = item.props ? item.props.itemClassName : item.itemClassName;
if (isListItem) { if (isListItem) {
item.props.key = item.itemName; item.attrs = item.attrs || {};
item.attrs.key = item.attrs.key || item.itemName;
} }
var space = new String(' ');
space.attrs = { key: '_space_' + item.itemName };
return [isListItem ? item : m( return [isListItem ? item : m(
'li', 'li',
{ className: classList([item.itemName ? 'item-' + item.itemName : '', className, active ? 'active' : '']), { className: classList([item.itemName ? 'item-' + item.itemName : '', className, active ? 'active' : '']),
key: item.itemName }, key: item.itemName },
item item
), ' ']; ), space];
}); });
} }

View File

@ -35,9 +35,13 @@ export default function listItems(items) {
const className = item.props ? item.props.itemClassName : item.itemClassName; const className = item.props ? item.props.itemClassName : item.itemClassName;
if (isListItem) { if (isListItem) {
item.props.key = item.itemName; item.attrs = item.attrs || {};
item.attrs.key = item.attrs.key || item.itemName;
} }
const space = new String(' ');
space.attrs = {key: '_space_'+item.itemName};
return [ return [
isListItem isListItem
? item ? item
@ -49,7 +53,7 @@ export default function listItems(items) {
key={item.itemName}> key={item.itemName}>
{item} {item}
</li>, </li>,
' ' space
]; ];
}); });
} }