censor(object, extra)
Açıklama
Yaşam döngüsü özelliklerini ve belirtilen ek özellikleri atlayarak nesnenin sığ bir kopyasını döndürür.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
İmza
censored = m.censor(object, extra)
Argüman | Tip | Gerekli | Açıklama |
---|---|---|---|
object | Object | Evet | Anahtar-değer çiftlerini içeren nesne. |
extra | Array<String> | Hayır | Atlanacak ek özelliklerin listesi. |
döner | Object | Atlanacak özellik yoksa orijinal nesneyi, aksi takdirde atlanan özelliklere sahip sığ bir kopyasını döndürür. |
Nasıl Çalışır
Genellikle bu yönteme doğrudan ihtiyacınız olmaz ve yalnızca istediğiniz özellikleri açıkça belirtmek istersiniz. Ancak bazen, bilmediğiniz tüm özellikleri başka bir öğeye aktarmak daha pratik olabilir. Bu genellikle kabul edilebilir bir yaklaşımdır, ancak yaşam döngüsü yöntemlerinin birden çok kez çağrılması gibi beklenmedik durumlara yol açabilir.
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, [
// !!!
// ...
]);
},
};
}
Bu zararsız gibi görünse de, bir soruna neden olur: bu görünüme her geçişte iki kez istek gönderirsiniz. m.censor
burada devreye girer: oncreate
özelliğini filtreleyerek yalnızca bir kez çağrılmasını sağlar. Bu sayede, çağıran kişi bu durumdan kaynaklanan beklenmedik hatalarla uğraşmak zorunda kalmaz.
// Düzeltildi
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Benzer sorunlarla key
(anahtarlar) özelliğiyle de karşılaşabilirsiniz:
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,
]),
];
},
};
}
Bu, bir hataya neden olur çünkü Mithril.js'nin Layout
vnode'unu oluştururken gördüğü şey şudur:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Özellikle dolaylılığın veya başka karmaşıklıkların olduğu senaryolarda, bunu ilk bakışta fark etmek zor olabilir. Bunu düzeltmek için, benzer şekilde key:
özelliğini sansürlemeniz gerekir. DOM'da bulunmasının bir anlamı olmadığından, özel pageTitle
özelliğini de sansürleyebilirsiniz.
// Düzeltildi
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', m.censor(vnode.attrs, ['pageTitle', 'key']), [
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}