prop(attrName, callback)
- Core
- Optional
- Tooling
Description
Returns a simple getter/setter object.
var name = m.prop("John")
var oldName = name.get() // First, it's set to "John"
name.set("Mary") // Set the value to "Mary"
var newName = name.get() // Now it's "Mary", not "John"
Signature
prop = m.prop(initial?)
Argument | Type | Required | Description |
---|---|---|---|
initial |
any |
No | The prop's initial value |
returns | Prop |
A prop |
value = prop.get()
Argument | Type | Required | Description |
---|---|---|---|
returns | any |
The prop's current value |
newValue = prop.set(newValue)
Argument | Type | Required | Description |
---|---|---|---|
newValue |
any |
Yes | The value to set the prop to |
returns | any |
The value you just set the prop to, for convenience |
How it works
The m.prop
method creates a prop, a getter/setter object wrapping a single mutable reference. You can get the current value with prop.get()
and set it with prop.set(value)
. Unlike streams, you can't observe them, so you can't do as much with them.
In conjunction with m.withAttr
, you can emulate two-way binding pretty easily.
var Component = {
oninit: function(vnode) {
vnode.state.current = m.prop("")
},
view: function(vnode) {
return m("input", {
oninput: m.withAttr("value", vnode.state.current.set),
value: vnode.state.current.get(),
})
}
}
They're also useful for making simpler models.
// With props
var Auth = {
username: m.prop(""),
password: m.prop(""),
canSubmit: function() {
return Auth.username.get() !== "" && Auth.password.get() !== ""
},
login: function() {
// ...
},
}
// Without props
var Auth = {
username: "",
password: "",
setUsername: function(value) {
Auth.username = value
}
setPassword: function(value) {
Auth.password = value
}
canSubmit: function() {
return Auth.username !== "" && Auth.password !== ""
},
login: function() {
// ...
},
}
Sending through requests
For convenience, props define .toJSON
as an alias for .get
. This is so you can send them through m.request
without serializing them manually.
We could also take this model and simplify it:
// How it's loaded
User.load = function(id) {
return m.request({
method: "GET",
url: "https://mithril-rem.fly.dev/api/users/" + id,
withCredentials: true,
})
.then(function(result) {
User.current = {
id: result.id,
firstName: m.prop(result.firstName),
lastName: m.prop(result.lastName),
}
})
}
// Original
User.save = function(user) {
return m.request({
method: "PUT",
url: "https://mithril-rem.fly.dev/api/users/" + user.id,
data: {
id: user.id,
firstName: user.firstName.get(),
lastName: user.lastName.get(),
},
withCredentials: true,
})
}
// Simplified
User.save = function(user) {
return m.request({
method: "PUT",
url: "https://mithril-rem.fly.dev/api/users/" + user.id,
data: user,
withCredentials: true,
})
}
License: MIT. © Leo Horie.