nTest

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
opa简单练习

opa简单练习

1 安装

Opa的官方网站:http://opalang.org

下载安装opa后,会询问安装node.js和mongodb,从网站上分别下载安装后,会自 动下载node.js需要的module.

2 Hello,world

新建hello.opa,写如下代码

Server.start(
    Server.http,
    { title: "你好,Opa",
      page: function() { <h1>Hello, Opa,中文测试</h1> }
    }
)

注意文件要用UTF-8格式保存,否则编译失败.

然后用opa hello.opa编译,生成hello.js和package.json。 windows下不能直接运行服务器,手动输入node hello.js启动服务器

node启动服务器时会提示找不到module, NODE_PATH环境变量设置错误, 添加%APPDATA%\npm\node_modules;到环境变量NODE_PATH即可.

启动服务器后,就可以从浏览器打开127.0.0.1:8080进行查看了

3 Hello, chat

实现一个简单的聊天室 opa craete在windows下不好使。

用单文件实现:

type message = {
    string author,
    string text
}

//数据模型, Model 
module Data {
    private Network.network(message) room = Network.cloud("room")

    exposed function broadcast(message) {
        Network.broadcast(message, room);
    }

    function register_message_callback(callback) {
        Network.add_callback(callback, room);
    }

    function new_author() {
        Random.string(8);
    }
}

//页面,也就是View, 
module Page {

  //生成页面
  function page_template(title, content) {
    html =
      <div class="navbar navbar-fixed-top">
        <div class=navbar-inner>
          <div class=container>
              <div id=#logo />
          </div>
        </div>
      </div>
      <div id=#main>
        {content}
      </div>
    Resource.page(title, html)
  }

    //消息更新后的回调处理,添加新消息内容
    function user_update(message msg) {
        line = <div class="row line">
                <div class="span1 userpic" />
            <div class="span2 user">{msg.author};</>
            <div class="span9 mesage">{msg.text}</>
            </div>;
                #conversation =+ line;
                Dom.scroll_to_bottom(#conversation);
    }                       

    //将文本中的消息广播给所有连接的用户
    function broadcast(author) {
             text = Dom.get_value(#entry);
             Data.broadcast(~{author,text});
             Dom.clear_value(#entry);
    }

    //生成发送消息框, 其中注册消息更新的回调事件
    function chat_html(author) {
        <div id=#conversation class=container-fluid
            onready={function(_) { Data.register_message_callback(user_update)}} />
                <div id=#footer class="navbar navbar-fixed-bottom">
                    <div class=container>
                        <div class=input-append>
                        <input id=#entry class=input-xxlarge type=text
                        onnewline={function(_) { broadcast(author) }}>
            <button class="btn btn-primary" type=button
                onclick={function(_) { broadcast(author) }}>发送</>
                    </div>
                </div>
       </div>
    }

  //每次请求都生成一个新author  
  function default_page() {
    author = Data.new_author();
    page_template("Opa chat", chat_html(author));       
  }

}


//控制器 ,所有地址都去default_page
module Controller {
  dispatcher = {
    parser {
    case (.*) : Page.default_page()
    }
  }

}

//资源,编译后所有资源都静态嵌入js
resources = @static_resource_directory("resources")

Server.start(Server.http, [
  { register:
    [ { doctype: { html5 } },
      { js: [ ] },
      { css: [ "/resources/css/style.css"] }
    ]
  },
  { ~resources },
  { custom: Controller.dispatcher }
])

保存为chat.opa, 资源文件可以从这里下载。 把resources文件夹放到chat.opa同目录下,然后用opa chat.opa, node chat.js即可启动服务器。

4 总结

写完示例后,放弃了,opa不是我想要的。 文档太少,而且1.0经历了重大改变,采用node.js做后端

Date: 2013-01-21 星期一

Author: nTest

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0
posted on 2013-01-21 21:29  nTest  阅读(352)  评论(0编辑  收藏  举报