zhaoda / spa

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

如何实现删除前弹出确认面板,根据确认面板的选择执行相应的操作?能否指点一下? #18

Closed jaryway closed 9 years ago

jaryway commented 9 years ago

我现在是通过 pushData,将方法传递到 ”确认面板“,再在”确认面板“中驱动事件。这种符合解耦标准。

//homepage.js
//删除事件
$view.on('click', '.btn-delete-news', function (event) {
    event.preventDefault()
    var $btn = $(this), panelid = $btn.attr('data-panel');

    var $pushData = {
        id: $btn.attr('data-id'),
        onsure: function () {
            console.log("ok");
        },
        oncancel: function () {
            console.log("cancel");
        }
    };

    $doc.trigger('spa:openpanel', [panelid, $pushData]);
})
//confirmpanel.js 
init: function (panelData) {
    var $view = this, $dialog = $('.panel', $view)

    $('.container', $view).trigger('spa:scroll');
    var $pushData = panelData.pushData;

    $view.on('click touchstart', 'button.btn-sure', function (event) {
        $view.trigger('spa:closepanel')
        event.stopPropagation()
        event.preventDefault()
        if ($pushData.onsure)
            $pushData.onsure();
    });

    $view.on('click touchstart', 'button.btn-cancel', function (event) {
        $view.trigger('spa:closepanel')
        event.stopPropagation()
        event.preventDefault()
        if ($pushData.oncancel)
            $pushData.oncancel();
    })

},
zhaoda commented 9 years ago

这么做没有问题,或者给你的被确认组件注册自定义事件,然后在确认面板选择“是否”后,trigger那些自定义事件(带着需要的参数,这些参数也是确认面板打开的时候传递进来的)

jaryway commented 9 years ago

我提的问题都可以作为spa的api文档了。哈哈

jaryway commented 9 years ago

为什么路由不匹配(不存在)也触发loding事件?

zhaoda commented 9 years ago

这种情况你做一个通用的路由放在最后面,来匹配那些前面没有匹配成功的路由,做一个类似404的页面视图,否则就会报错卡住。

jaryway commented 9 years ago

@zhaoda 如何销毁view?比如添加新闻后重置添加页面。

zhaoda commented 9 years ago

这种情况下,一般是在视图内做重置,而不是主动销毁视图重新生成,spa内部已经内置了cache机制,不活跃的视图会被自动销毁。

设置清理页面最多缓存的页面数量

https://github.com/zhaoda/spa/blob/master/src/spa.js#L1799

可以主动设置视图不进入缓存队列

https://github.com/zhaoda/spa/blob/master/src/spa.js#L1364 设置nocache

jaryway commented 9 years ago

恩,调用from rest() 就可以。如何刷新视图呢?比如新闻添加后刷新新闻列表

zhaoda commented 9 years ago

这种情况一般都是视图内的局部刷新,就是通常的业务逻辑,因为你能拿到视图的dom,所以视图里面做什么就是你的业务逻辑了,一般在视图的view、init、beforeopen、afteropen、beforeclose、afterclose回调里实现,和spa就没有太多的耦合了。

jaryway commented 9 years ago

现在是要从添加视图,刷新列表视图。

zhaoda commented 9 years ago

你说的都是具体的业务逻辑了,也就是说spa的视图内的组件,这些代码和逻辑和spa本身关系不大,只要在spa的视图定义时,在view、init(一般在init中)中初始化你的组件就好了,我们一般是通过事件代理的方式把组件的接口注册到doc的自定义事件中。

jaryway commented 9 years ago

就是说我有一个editview,一个listview,在listview中点击新建按钮,展示editview,添加数据后刷新listview。能不能在listview上添加一个update事件,让editview触发list的update事件?

zhaoda commented 9 years ago

可能是我说的不清楚,你的listview里面有一个列表的组件,你的editview里面有一个编辑组件,他们的功能都是组件本身的,只是他们的视图(html)是插入到spa视图里面的,他们之间的交互其实应该和spa解耦,没必要往spa上面注册事件,就和你正常做pc端的网页一样,这么说是否能更清楚?

jaryway commented 9 years ago

正如你所说,只是之前不知道怎么注册事件,原来这样注册事件。

$view.on('update', function (event, model) {
    var currentdiv = $view.find("div[data-news-id='" + model.id + "']");
    require(["newslistitem"], function (template) {
        var html = template(model);
        if (currentdiv && currentdiv.length > 0) {
            currentdiv.replaceWith(html);
        } else {
            $(".newslist-container", $view).append(html);
        }
    });
})
jaryway commented 9 years ago

spa能与backbone共用吗?感觉backbone的mvc用起来体验更好,只是少了动画。

zhaoda commented 9 years ago
  1. 自定义事件最好给一个命名空间,可以用组件名前缀,防止冲突;
  2. 如果引入backbone,还要引入underscore,代码量有点大啊,但是如果你要用backbone的mvc模式,可以引用,理论上不会有冲突。
jaryway commented 9 years ago

@zhaoda spa:navigate 事件 不能把方法以pushdata传递到下个页面中吗? 一直报 DataCloneError: The object could not be cloned. 方法只能在pannel间传递吗?

zhaoda commented 9 years ago

spa:navigate事件的pushdata参数会通过浏览器原生的history.pushState(state, title, url)进行原生的传递和保存,state对象必须是可以序列化的,而且还有大小限制。

请参考 https://developer.mozilla.org/zh-CN/docs/DOM/Manipulating_the_browser_history#pushState().E6.96.B9.E6.B3.95

jaryway commented 9 years ago

又涨知识了