censor(object, extra)
Beschreibung
Gibt ein flach geklontes Objekt zurück, bei dem Lebenszyklus-Hooks und alle angegebenen benutzerdefinierten Attribute entfernt wurden.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
Signatur
censored = m.censor(object, extra)
Argument | Typ | Erforderlich | Beschreibung |
---|---|---|---|
object | Object | Ja | Ein Schlüssel-Wert-Paar-Objekt, das zensiert werden soll. |
extra | Array<String> | Nein | Zusätzliche Eigenschaften, die entfernt werden sollen. |
returns | Object | Das Originalobjekt, wenn keine Eigenschaften zum Entfernen vorhanden sind, andernfalls ein flach geklontes Objekt mit den entfernten Eigenschaften. |
Wie es funktioniert
In den meisten Fällen ist diese Methode nicht erforderlich, und es ist ratsam, nur die benötigten Attribute explizit anzugeben. Gelegentlich kann es jedoch bequemer sein, alle unbekannten Attribute an ein anderes Element weiterzuleiten. Dies kann sinnvoll sein, birgt aber das Risiko, Lebenszyklus-Methoden unbeabsichtigt mehrfach aufzurufen.
function SomePage() {
return {
view: function () {
return m(SomeFancyView, {
oncreate: function () {
sendViewHit(m.route.get(), 'some fancy view');
},
});
},
};
}
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', vnode.attrs, [
// !!!
// ...
]);
},
};
}
Auf den ersten Blick unproblematisch, führt dieser Code zu einem unerwünschten Verhalten: sendViewHit
wird jedes Mal zweimal aufgerufen. Hier kommt m.censor
ins Spiel. Es ermöglicht, das oncreate
Attribut zu entfernen, sodass es nur einmal aufgerufen wird und der Aufrufer sicher sein kann, dass keine unerwarteten Fehler auftreten.
// Behoben
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Ähnliche Probleme können mit dem key
Attribut auftreten:
function SomePage() {
return {
view: function () {
return m(
Layout,
{
pageTitle: 'Some Page',
key: someKey,
},
[
// ...
]
);
},
};
}
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', vnode.attrs, [
// !!!
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}
Dies würde letztendlich einen Fehler auslösen, da Mithril.js beim Erzeugen des Layout
VNodes (virtueller DOM-Knoten) Folgendes sieht:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Dies ist möglicherweise nicht sofort erkennbar, insbesondere in komplexeren Szenarien mit Indirektion und/oder anderen Problemen. Um dies zu beheben, muss das key:
Attribut auf ähnliche Weise zensiert werden. Das benutzerdefinierte pageTitle
Attribut kann ebenfalls entfernt werden, da es keinen Mehrwert im DOM bietet.
// Behoben
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', m.censor(vnode.attrs, ['pageTitle']), [
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}