censor(object, extra)
Leírás
Létrehoz egy sekély másolatot egy objektumról, amelyből eltávolítja az életciklus-attribútumokat és a megadott egyéni attribútumokat.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
Szignatúra
censored = m.censor(object, extra)
Argumentum | Típus | Kötelező | Leírás |
---|---|---|---|
object | Object | Igen | Egy kulcs-érték párokat tartalmazó objektum, amelyből az attribútumok eltávolításra kerülnek. |
extra | Array<String> | Nem | További eltávolítandó tulajdonságok neveinek tömbje. |
visszatérési érték | Object | Az eredeti objektum, ha nem volt eltávolítandó tulajdonság, egyébként egy sekély másolat az eltávolított tulajdonságokkal. |
Hogyan kell olvasni a szignatúrákat
Hogyan működik
Általában nincs szükség erre a metódusra, elegendő csak a kívánt attribútumokat megadni. Azonban néha kényelmesebb lehet az összes nem kívánt attribútumot egy másik elemnek átadni. Ez gyakran teljesen ésszerű, de komoly problémákhoz vezethet, ha az életciklus metódusok kétszer kerülnek meghívásra.
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, [
// !!!
// ...
]);
},
};
}
Ez ártalmatlannak tűnik, de problémát okoz: minden alkalommal kétszer kerül rögzítésre a megtekintés, amikor erre a nézetre navigálunk. Itt válik fontossá az m.censor
: lehetővé teszi, hogy eltávolítsuk az oncreate
attribútumot, így az csak egyszer kerül meghívásra, és a hívó fél biztos lehet abban, hogy nem kell szokatlan hibákkal szembesülnie emiatt.
// Javítva
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Hasonló problémákba ütközhetsz a kulcsokkal is.
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,
]),
];
},
};
}
Ez végül hibát fog eredményezni, mert a Mithril.js ezt látja a Layout
vnode létrehozásakor:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Valószínűleg nem fogod ezt első pillantásra észrevenni, különösen összetettebb esetekben, ahol indirekciók és/vagy egyéb problémák is felmerülhetnek. Ennek javításához el kell távolítanod a key:
attribútumot. Eltávolíthatod az egyéni pageTitle
attribútumot is, mivel nem ad hozzá valódi értéket a DOM-hoz.
// Javítva
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,
]),
];
},
};
}