Horn.js
simple reactive view framework inspired by knockout, angular and backbone
Install / Use
/learn @mizchi/Horn.jsREADME
Horn.js
Fast and simple reactive view framework. inspired by angular, backbone and knockout.

Features
- angular like directive
- knockout like data-bind
- backbone like view API (coffee-script friendly)
- simple list view implementation
- less code, more powerful
Requirements
- jQuery
Install
User bower
$ bower install horn
Example
# Define custom directive
Horn.addDirective "data-click-with-trigger", (view) ->
$el = view.$("[data-click-with-trigger]")
$el.on 'click', (e) =>
eventName = $(e.target).data('click-with-trigger')
view.trigger eventName
# Register as raw string. This root need to have data-temaplate-name.
# Write your templates as your way.
Horn.registerTemplate """
<div
data-template-name="my-status"
data-attrs="name, money, showAddMoney">
<span data-text="name">NO NAME</span>
<span data-text="money">0</span>
<button data-click-with-trigger="update">update</button>
<button data-click="toggleShowAddMoney">toggle show add money</button>
<button data-visible="showAddMoney" data-click="addMoney">addMoney</button>
</div>
"""
# It extends Horn.View and binds template by templateName
class Status extends Horn.View
templateName: 'my-status'
addMoney: ->
@money += 10 # data-attrs generate getters.
# data-text='money' change view soon.
toggleShowAddMoney: ->
@showAddMoney = !@showAddMoney
# ListView has itemView
class StatusList extends Horn.ListView
itemView: Status
$ ->
# View
status = new Status
status.name = 'foo'
status.money = 0
# attach
status.attach 'body'
status.on 'update', -> console.log 'updated' # fired by custom directive
# ListView
list = new StatusList
list.size(2) # generate automatically 2 blank view.
list.update [{name: 1},{name: 2},{name: 3}] # generate automatically 3 view and apply params.
list.addItem {name: 4} # add more
list.attach 'body'
See detail at examples.
API
Horn
- Horn.registerTemplate(templateString)
- Horn.addDirective(name, fn)
- Horn.addDirectiveByEachElement(name, fn)
- Horn.addDirectiveByEachValue(name, fn)
Default directives
- data-text
- data-click
- data-visible
Create your own custom directive via Horn.addDirective family
For example, data-click is defined like this.
Horn.addDirectiveByEachElement "data-click", (view, $el, val) ->
$el.on 'click', (view[val].bind view)
Horn.View
Backbone.View like API This has clone of Backbone.Events API
- View#$(selector)
- View#_$(selector) # cache result
- View#on
- View#off
- View#trigger
- View#attach(selector)
- View#detach()
- View#show()
- View#hide()
- View#remove()
Horn.ListView
ListView has all Horn.View API
- ListView#size()
- ListView#size(num)
- ListView#addItem(item)
- ListView#get(num)
- ListView#toJSON()
- ListView#update(items)
Generate views as its size.
Motivation
I used chaplin.js and Backbone.stickit for data bindings. In this style, I had to write many code even if I created simple view. I need simple extendable template with js mappings as less-code as I can. I don't need ajax wrapper nor mapping because REST API is enough for me to make application.
TODO
- Router and View instance mapping
- Document
- Test
- AMD style
- Benchmark
Related Skills
node-connect
352.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
111.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
352.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
352.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
