zhaoda / spa

A webapp framework for routing control and view transitions
http://zhaoda.net/spa/docs/
MIT License
330 stars 92 forks source link

@zhaoda spa支不支持cmd 加载?有没有栗子? #17

Closed jaryway closed 9 years ago

zhaoda commented 9 years ago

支持,只要放在模块闭包里就行,不对外暴露模块接口,spa依赖zepto或者jquery,少量的方法和属性是注册在$下的,主要的接口都是通过事件的方式调用的,你看docs的代码,就是用了cmd。

zhaoda commented 9 years ago

或者这么说,spa不会和cmd模式有冲突,这么解释更好一些。

jaryway commented 9 years ago

spa 还得深入研究一下,我看看怎么组织文档结构,还有spa表单验证这块还没接触过。

zhaoda commented 9 years ago

spa没有表单验证功能

zhaoda commented 9 years ago

spa核心就做两件事:路由控制和视图转换,目的是构建nativeApp体验的webApp。

jaryway commented 9 years ago

知道,表单验证在事件上做,需要处理一下。换成jquery 报错$.os is undefined

jaryway commented 9 years ago

官方demo也是一样

zhaoda commented 9 years ago

哦,看来jquery不支持$.os了,我们后来也没有测试jquery,主要都是做移动端,用zepto;你可以引zepto中的detect.js来支持$.os https://github.com/madrobby/zepto/blob/master/src/detect.js#files

zhaoda commented 9 years ago

还不能完全引用,你把detect.js copy到你的代码中,放在jquery后面加载,把他最后一样的Zepto换成jQuery

jaryway commented 9 years ago

我在选择到底用zepto还jquery方面好纠结。使用jquery文件大不适合移动端,但是有丰富的插件支持比如验证插件,使用zepto文件是小了,但是相关的插件就少的可怜。

zhaoda commented 9 years ago

建议用zepto,插件如果不是非常必要,尽量自己写,表单验证之类的,如果场景不错复杂度不高,自己写就好了,或者从其他里代码剥离出来核心放在自己代码里,用太多插件加载的的文件就越多,影响速度和性能,移动端尽量轻量化。

jaryway commented 9 years ago

用seajs报错 ReferenceError: event is not defined。不支持seajs?

zhaoda commented 9 years ago

这是哪里报的错?要保证zepto先加载,再加载spa。

jaryway commented 9 years ago

我觉得是我的写法有问题,但是不知道怎么写

<script type="text/javascript">
    seajs.config({
        base: "/scripts/",
        alias: {
            "zepto": "dist/zepto/zepto.js"
        }
    });

    seajs.use(["zepto", "spa", "address/startup"]);
</script>
//startup文件
define(function (require, exports, module) {
    var $ = require("zepto");
    console.log(require.resolve("spa"));
    var $doc = $(document);
    // 首页
    var pageHome = {
        route: '',
        classname: 'home',
        animate: 'fadeIn',
        view: function () {
            var $page = this
            require(['spa','address/home'], function (viewData) {
                $doc.trigger('spa:initpage', [$page, viewData])
            })
        }
    }

    $doc.trigger('spa:route', [pageHome])

    $(function () {
        $doc.trigger('spa:boot')
    })

});
jaryway commented 9 years ago

似乎boot文件不能放入cmd定义中?

zhaoda commented 9 years ago

spa没加载成功吧,spa没有进行cmd封装,你需要自行封装一下。

jaryway commented 9 years ago

哎呀,不会封装。

zhaoda commented 9 years ago
define(function(require) {
  // SPA源码放在这里  

  // 返回spa对象
  return $.spa
});
jaryway commented 9 years ago

这样子试过了不行的哦,你试成功了?

zhaoda commented 9 years ago

没有试,因为zepto和spa是底层框架,所以我们都是直接引用的。

jaryway commented 9 years ago

已经做出来

<script src="/scripts/require.js"></script>
<script type="text/javascript">
    requirejs.config({
        baseUrl: '/scripts/',
        // urlArgs: "v=" +  (new Date()).getTime(),
        urlArgs: 'v=20140320',
        paths: {
            'zepto': 'dist/zepto/zepto.min',
            'spa': 'dist/spa/spa-c'
        }
    })
    require(['zepto', 'spa', 'app/startup']);
</script>
//routers.js
define(["zepto"], function ($) {
    var $doc = $(document);
    return [{
        route: '',
        classname: 'home',
        animate: 'fadeIn',
        view: function () {
            var $page = this;
            requirejs(['app/views/homepage'], function (viewData) {
                $doc.trigger('spa:initpage', [$page, viewData])
            })
        }
    },
    {
        route: 'demo/newpage',
        classname: 'demo-newpage',
        animate: 'slideInRight',
        view: function () {
            var $page = this;
            requirejs(['app/views/newpage'], function (viewData) {
                $doc.trigger('spa:initpage', [$page, viewData])
            })
        }
    }];
});
//startup.js
define(function (require) {
    var $ = require('zepto');
    var $doc = $(document);

    //加载路由设置
    var routers = require("app/routers");
    $doc.trigger('spa:route', routers);
    //启动程序
    $(function () { $doc.trigger('spa:boot') });
})

这种方式很优雅,有木有? @zhaoda 啥时候支持回jquery

zhaoda commented 9 years ago

@jaryway 手动大赞! jQuery的问题是这样,应该是由于个别Zepto的属性或者方法和jQuery不兼容,你可以先试试自己用jQuery调试一下,看看SPA需要进行哪些改动,如果你弄好了,可以直接把SPA的代码pull给我,一起贡献代码,谢谢。

jaryway commented 9 years ago

贡献代码以后应该可以,现在还在熟悉怎么使用。

zhaoda commented 9 years ago

@jaryway 发布了1.0.7新版本,兼容jQuery