censor(object, extra)
Popis
Vrací mělkou kopii objektu, ze které jsou odstraněny atributy životního cyklu a volitelné uživatelské atributy.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
Signatura
censored = m.censor(object, extra)
Argument | Type | Required | Description |
---|---|---|---|
object | Object | Yes | Mapa klíč-hodnota. |
extra | Array<String> | No | Další vlastnosti, které mají být odstraněny. |
returns | Object | Původní objekt, pokud nebyly nalezeny žádné vlastnosti k odstranění; jinak se vrátí mělce klonovaný objekt s odebranými vlastnostmi. |
Jak to funguje
Běžně tuto metodu nepotřebujete a budete chtít explicitně zadat pouze atributy, které chcete použít. Někdy je ale pohodlnější předat všechny atributy, i když si nejste jisti, zda je cílový prvek potřebuje. To je často přijatelné, ale může to vést k problémům s metodami životního cyklu, které se volají opakovaně.
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, [
// !!!
// ...
]);
},
};
}
Vypadá to neškodně, ale vytváří to problém: sendViewHit
se volá dvakrát pokaždé, když se na toto zobrazení přejde. Zde přichází na řadu m.censor
: umožňuje vám odstranit oncreate
z atributů, aby se volal pouze jednou, a zároveň zachovat srozumitelnost volajícího kódu a předejít neočekávaným chybám.
// Opraveno
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Podobné problémy mohou nastat i s klíči:
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,
]),
];
},
};
}
To by nakonec vyvolalo chybu, protože Mithril.js vidí při vytváření Layout
vnode toto:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Pravděpodobně byste si toho na první pohled nevšimli, zejména v reálnějších scénářích, kde se používají složitější postupy a/nebo se vyskytují jiné problémy. Chcete-li to napravit, musíte podobně odstranit atribut key
. Můžete také odstranit vlastní atribut pageTitle
, protože není pro DOM relevantní.
// Opraveno
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,
]),
];
},
};
}