我正在尝试使用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控制器返回的对象中。

09-25 18:04