Skip to content

Commit e33b0f8

Browse files
committed
change binding and isolate interaction with view to onload
1 parent 1214451 commit e33b0f8

File tree

25 files changed

+290
-257
lines changed

25 files changed

+290
-257
lines changed

Cargo.toml

-4
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ repository = "https://github.com/anowell/quasar"
99
rustc-serialize = "0.3.18"
1010
downcast-rs = "0.1.2"
1111
uuid = { version = "0.4.0", features = ["v4"] }
12-
mustache = { version = "0.8.0", optional = true }
1312

1413
[dependencies.webplatform]
1514
#git = "https://github.com/anowell/rust-webplatform.git"
1615
path = "../rust-webplatform"
17-
18-
[features]
19-
default = ["mustache"]

README.md

+10-9
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,21 @@ A basic example might include an HTML file like this:
4141
You can bind and update data with a snippet like this:
4242

4343
```rust
44-
#[derive(BartDisplay)]
44+
#[derive(Default, BartDisplay)]
4545
#[template_string = "<p>Count: {{count}}</p><button>+1</button>"]
4646
struct CounterData { count: u32 }
4747

48-
fn main() {
49-
let mut app = quasar::init();
50-
51-
let component = CounterData { count: 0 };
52-
app.bind("#counter", component)
53-
.query("button").unwrap()
54-
.on(EventType::Click, |mut evt| {
55-
evt.binding.data_mut().count += 1;
48+
impl Component for CounterData {
49+
fn onload(view: &View<Self>) {
50+
view.on_each(EventType::Click, "button", |mut evt| {
51+
evt.binding.data_mut().count += 1;
5652
});
53+
}
54+
}
5755

56+
fn main() {
57+
let mut app = quasar::init();
58+
app.bind("#counter", CounterData::default());
5859
app.spin();
5960
}
6061
```

examples/app/src/components/cat_list.rs

-47
This file was deleted.

examples/app/src/components/counter.rs

-27
This file was deleted.

examples/app/src/components/mod.rs

-13
This file was deleted.

examples/app/src/components/todo.rs

-51
This file was deleted.
+7-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use quasar::*;
22

3-
struct CounterData {
3+
#[derive(Default)]
4+
pub struct CounterData {
45
count: u32,
56
}
67

@@ -13,13 +14,10 @@ impl Renderable for CounterData {
1314
}
1415
}
1516

16-
pub fn init(app: &QuasarApp) {
17-
let component = CounterData {
18-
count: 0
19-
};
20-
21-
app.bind("#counter", component)
22-
.on_each(EventType::Click, "button", |mut evt| {
17+
impl Component for CounterData {
18+
fn onload(view: &View<Self>) {
19+
view.on_each(EventType::Click, "button", |mut evt| {
2320
evt.binding.data_mut().count += 1;
2421
});
25-
}
22+
}
23+
}

examples/maudapp/src/components/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ mod counter;
33
// mod cat_list;
44
mod todo;
55

6-
use quasar::QuasarApp;
6+
use quasar::{QuasarApp, Queryable};
7+
use self::todo::TodoList;
8+
use self::counter::CounterData;
79

810
pub fn init(app: &QuasarApp) {
911
// hello::init(&app);
10-
counter::init(&app);
1112
// cat_list::init(&app);
12-
todo::init(&app);
13+
app.bind("#counter", CounterData::default());
14+
app.bind("#todo-list", TodoList::default());
1315
}
+23-27
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use quasar::*;
22

3-
struct TodoItem {
3+
#[derive(Default)]
4+
pub struct TodoItem {
45
label: String,
56
complete: bool,
67
}
78

8-
struct TodoList {
9+
#[derive(Default)]
10+
pub struct TodoList {
911
items: Vec<TodoItem>,
1012
}
1113

@@ -27,31 +29,25 @@ impl Renderable for TodoList {
2729
}
2830
}
2931

30-
pub fn init(app: &QuasarApp) {
31-
let component = TodoList {
32-
items: vec![
33-
TodoItem { label: "Example Task".to_string(), complete: false },
34-
]
35-
};
36-
37-
let view = app.bind("#todo-list", component);
38-
39-
// TODO: use view.query("button").on(...)
40-
// but since we don't patch the DOM yet, the attached element
41-
// is always destroyed, so we need to attach the event to a nested selector fo now
42-
view.on_each(EventType::Click, "button", |mut evt| {
43-
match evt.binding.query("#message") {
44-
Some(node) => {
45-
let item = TodoItem { label: node.get("value"), complete: false };
46-
evt.binding.data_mut().items.push(item);
32+
impl Component for TodoList {
33+
fn onload(view: &View<Self>) {
34+
// TODO: use view.query("button").on(...)
35+
// but since we don't patch the DOM yet, the attached element
36+
// is always destroyed, so we need to attach the event to a nested selector fo now
37+
view.on_each(EventType::Click, "button", |mut evt| {
38+
match evt.binding.query("#message") {
39+
Some(node) => {
40+
let item = TodoItem { label: node.get("value"), complete: false };
41+
evt.binding.data_mut().items.push(item);
42+
}
43+
None => println!("Query for #message returned nothing.")
4744
}
48-
None => println!("Query for #message returned nothing.")
49-
}
50-
});
45+
});
5146

52-
view.on_each(EventType::Change, ".todo-item input", |mut evt| {
53-
let state = evt.target.checked();
54-
let mut item_list = evt.binding.data_mut();
55-
item_list.items[evt.index].complete = state;
56-
});
47+
view.on_each(EventType::Change, ".todo-item input", |mut evt| {
48+
let state = evt.target.checked();
49+
let mut item_list = evt.binding.data_mut();
50+
item_list.items[evt.index].complete = state;
51+
});
52+
}
5753
}
File renamed without changes.

examples/app/Cargo.toml examples/mustacheapp/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ authors = ["Anthony Nowell <[email protected]>"]
55

66
[dependencies]
77
rustc-serialize = "0.3.18"
8+
mustache = "0.8.0"
89
quasar = { path = "../.." }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use quasar::*;
2+
use helper::RuntimeComponent;
3+
4+
#[derive(Debug, RustcEncodable)]
5+
pub struct CatData { cats: Vec<Cat> }
6+
7+
#[derive(Debug, RustcEncodable)]
8+
pub struct Cat { name: String }
9+
10+
type CatComponent = RuntimeComponent<CatData, ::mustache::Template>;
11+
12+
pub fn init() -> CounterComponent {
13+
let cat_names = vec!["Bella", "Tiger", "Chloe", "Shadow", "Luna", "Oreo"];
14+
let cats = cat_names.iter()
15+
.map(|c| Cat{ name: c.to_string() })
16+
.collect();
17+
18+
RuntimeComponent {
19+
props: vec![],
20+
data: CatData {
21+
cats: cats
22+
},
23+
template: compile_str(r##"
24+
<ul>
25+
{{#cats}}
26+
<Cat catname='{{ name }}'></Cat>
27+
{{/cats}}
28+
</ul>
29+
"##).expect("failed to compile cat_list template")
30+
}
31+
32+
// TODO: currently lack a way to nest RuntimeComponents
33+
// Not sure if that's a good or bad thing yet...
34+
// RuntimeComponent {
35+
// data: (),
36+
// props: vec!["catname"],
37+
// template: compile_str(r##"
38+
// <li>{{ props.catname }}</li>
39+
// "##).expect("failed to compile cat_item template")
40+
// };
41+
42+
}
43+
44+
impl Component for CatComponent {
45+
fn onload(view: &View<Self>) {
46+
app.on_each(EventType::Click, "Cat".to_string(), |evt| {
47+
let catname = evt.target.get("catname");
48+
println!("MEOW {}", &catname);
49+
});
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use quasar::*;
2+
use helper::RuntimeComponent;
3+
4+
#[derive(Debug, RustcEncodable)]
5+
pub struct CounterData {
6+
count: u32,
7+
}
8+
9+
type CounterComponent = RuntimeComponent<CounterData, ::mustache::Template>;
10+
11+
pub fn init() -> CounterComponent {
12+
RuntimeComponent {
13+
data: CounterData {
14+
count: 0
15+
},
16+
17+
props: vec![],
18+
19+
template: compile_str(r##"
20+
<p>Count: {{count}}</p>
21+
<button>+1</button>
22+
"##).expect("failed to compile counter template")
23+
}
24+
}
25+
26+
impl Component for CounterComponent {
27+
fn onload(view: &View<Self>) {
28+
view.on_each(EventType::Click, "button", |mut evt| {
29+
evt.binding.data_mut().count += 1;
30+
});
31+
}
32+
}

0 commit comments

Comments
 (0)