我正在尝试使用Mithril.js制作SPA(单页应用程序)。
到目前为止,我已经找到了非常好的教程here,当然也有关于Mithril homepage的教程,但是仍然无法实现这两者的结合。
这是Dave指南中修改后的工作示例...
function btn(name, route){
var click = function(){ m.route(route); };
return m( "button", {onclick: click}, name );
}
function Page(content){
this.view = function(){
return [
m("page",
m("span", Menu.menu())
)
, m("div", content)
];
}
}
var Menu = {
menu: function(){
return [
btn("Home", "/home")
, btn("About", "/about")
];
}
};
var page_Home = new Page("The home of the Hobbits. Full of forests and marshes.");
var page_About = new Page(["The blighted home of Sauron. Scenic points of interest include:"]);
m.route(document.body, "/home", {
"/home": page_Home,
"/about": page_About
});
我的JSON文件:
[
{
"id":1,
"title": "Home",
"url": "/home",
"content":"This is home page"
},{
"id":2,
"title": "About",
"url": "/about",
"content":"This is about page"
},{
"id":3,
"title": "Galery",
"url": "/galery",
"content":"This is gallery page"
}
]
我从上面结合了这两个方面的努力:
//model
var PageSource = {
list: function() {
return m.request({method: "GET", url: "pages.json"});
}
};
var pages = PageSource.list();
var App = {
//controller
controller: function() {
return {
menu: pages
, rotate: function() { pages().push(pages().shift()); }
, id: m.route.param(pages.url)
}
},
//view
view: function(ctrl) {
return [
m("header"
, m("h1", "Page Title")
, m("span",
ctrl.menu().map(function(item) {
var click = function(){
console.log (item.url);
m.route(item.url);
};
return [
m("button", {onclick: click}, item.title)
];
})
)
, m("hr")
)
, m("button", {onclick: ctrl.rotate}, "Rotate links" )
, m("p", ctrl.content ) //CONTENT
];
}
};
//initialize
m.route(document.body, "/home", {
"/:id": App
});
最后,问题是:
-“如何从JSON文件中检索数据并根据所选按钮(路由)将其显示在div中?”
-“当我使用m.route时,我的整个视图都会刷新,但我只想重新加载更改的div。如何?”
请帮助,因为到目前为止,我真的很喜欢mithril.js
最佳答案
你近了
看来您的路由器配置了两次,后一个声明将覆盖第一个。在声明其他代码后,使用m.route声明一次路由。
当您尝试在App视图中引用ctrl.content时,由于尚未在App控制器中定义content属性,因此它将是未定义的。将想要作为content属性的任何内容添加到App控制器返回的对象中。