// ---------------------------------
// component with an input
// ---------------------------------
const inputWrapper = {
view : ( ctrl, args ) =>
m('input[type=text]', args )
}
// ---------------------------------
// component that filters list
// ---------------------------------
m.mount( document.body, {
controller : function( attrs ) {
const filterTerm = m.prop( '(?:)' )
return {
filterTerm,
filterFunc : word => {
const term = filterTerm()
if ( _.isString( term ) && _.isString( word ) )
return word.search( new RegExp( term, 'i' ) ) > -1
},
someData : [ "long", "list", "of", "meaningful", "data", "really", "cool", "stuff"]
}
},
view : ( { filterTerm, filterFunc, someData }, attrs ) =>
m('form',
m('p',
m('input[type=text]', {
oninput : m.withAttr( 'value', filterTerm ),
placeholder : 'filter data'
})
),
m('p',
m('ul',
someData
.reduce( ( acc, val ) =>
( ( filterTerm() && filterTerm() == '/(?:)/' ) || filterFunc(val) )
? acc.concat( val )
: acc,
[]
)
.map( value =>
m('li',
m('input', { value } ),
m(inputWrapper, { value } )
)
)
)
)
)
} )
<script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.5/mithril.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>