首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mithril.js源创建JSON SPA?

如何使用Mithril.js源创建JSON SPA?
EN

Stack Overflow用户
提问于 2015-11-13 09:59:54
回答 2查看 973关注 0票数 1

我正试图用Mithril.js制作一个SPA (单页应用程序)。到目前为止,我已经发现了非常好的教程这里,当然在Mithril主页上也是如此,但仍然不能实现这两者的结合。

下面是戴夫指南中修改的工作示例..。

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
[
 {
  "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"
 }
]

我努力把上面的这两件事结合起来:

代码语言:javascript
复制
//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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 14:20:16

多亏了@dcochran,我成功地做到了这一点:

代码语言:javascript
复制
//model
var PageSource = {
  list: function() {
    return m.request({method: "GET", url: "pages.json"});
  }
};
var pages = PageSource.list();
var id = m.prop()
  , url = m.prop()
  , title = m.prop()
  , content = m.prop();

var App = {
//controller
  controller: function() {
    return {
      menu: pages
    , rotate: function() { pages().push(pages().shift()); }
    }
  },

//view
  view: function(ctrl) {
    return  [
      m("header"
        , m("h1", "Page title")
        , m("span",
            ctrl.menu().map(function(item) { 
              return [ btn(item.title, item.url) ];
              function btn(name, route){
                var isCurrent = (url === route);
                var click = function(){ 
                  //m.route(route); 
                  id = item.id;
                  url = item.url; 
                  content = item.content;
                  title = item.title;
                };
                return m(
                  "button"+(isCurrent ? ".active" : ""), 
                  {onclick: click}, 
                  name
                );
              }
            })
          )
        , m("hr")
       )
    ,  m("button", {onclick: ctrl.rotate}, "Rotate links" )
    ,  m(".page", content )
    ];
  }
};
//initialize
m.route.mode = "hash";
m.route(document.body, "/home", { 
  "/:url": App
})
票数 0
EN

Stack Overflow用户

发布于 2015-11-14 00:10:38

你离我很近。

  1. 看起来您的路由器配置了两次,后者的声明将覆盖第一个声明。使用m.route一次并在声明了其他代码之后声明您的路由。
  2. 当您试图在App视图中引用ctrl.content时,由于您还没有在App控制器中定义一个内容属性,所以它将是未定义的。向App控制器返回的对象中添加您想要的任何内容属性。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33690057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档