`
desert3
  • 浏览: 2139855 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

knockoutjs 单页引用 客户端重定向(location.hash history.pushState)

 
阅读更多
大部分现代的,相应的,迷人的Web应用已经超越经典的Ajax,变成单页引用(single page applications:)。用户能象使用本地应用一样,在一个界面内完成各种操作,一个很著名的例子就是:GMail。

这些单页引用使用hash-based url 或者 pushState 导航来支持 浏览器的回退、前进、书签操作。(location.hash就是#锚点,一般用在Web页面内部的片段之间进行导航!)

data-bind="text: $data": $data表示引用foreach循环中的数组数据

data-bind="with: chosenFolderData": with表示后面的变量chosenFolderData不是null时,才使用绑定的相关控件。with内部的所有控件绑定变量时,引用就不需要再加chosenFolderData.前缀了,直接使用mails就可以

chosenFolderId, chosenFolderData , chosenMailData 都是被观察对象,在相关操作时给这些变量设置, 然后一些绑定到这些变量的UI会被自动更新。chosenFolderId是被观察者,所有取值、设置都是通过方法的形式做的

client-side navigation客户端重导航,使用hash-based url 或者 pushState技术。Sammy 就是使用hash-based url。

Sammy js client-side navigation的基本技术是采用一层额外的indirection客户端内部定向。没有使用之前,goToFolder 和goToMail 方法都是直接调用Ajax请求然后更新viewmodel 的状态。使用后,goToFolder 和goToMail 方法仅仅触发client-side navigation客户端导航,然后Sammy 包会捕获到客户端导航操作再发出相应的Ajax请求后再更新viewmodel状态。indirection客户端内部定向也就意味着如果用户点击浏览器上面的回退、前进按钮,Sammy会捕获到这些请求,然后viewmodel 会被正常更新

location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url。一个完整的URL地址的格式为:协议://主机:端口/路径名称#hash标识?搜索条件
location.hash则可以用来获取或设置页面的标签值。比如http://domain/#admin?a=1的location.hash="#admin?a=1"。
onhashchange在#后面的url发生变化时触发

<!-- Todo: Create UI -->
<script src="/scripts/lib/sammy.js" type="text/javascript"></script>

<!-- Folders -->
<ul class="folders" data-bind="foreach: folders">
    <li data-bind="text: $data,
               css: { selected: $data == $root.chosenFolderId() },
               click: $root.goToFolder"></li>
</ul>

<!-- Mails grid -->
<table class="mails" data-bind="with: chosenFolderData">
    <thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
    <tbody data-bind="foreach: mails">
        <tr data-bind="click: $root.goToMail">
            <td data-bind="text: from"></td>
            <td data-bind="text: to"></td>
            <td data-bind="text: subject"></td>
            <td data-bind="text: date"></td>
        </tr>     
    </tbody>
</table>


<!-- Chosen mail -->
<div class="viewMail" data-bind="with: chosenMailData">
    <div class="mailInfo">
        <h1 data-bind="text: subject"></h1>
        <p><label>From</label>: <span data-bind="text: from"></span></p>
        <p><label>To</label>: <span data-bind="text: to"></span></p>
        <p><label>Date</label>: <span data-bind="text: date"></span></p>
    </div>
    <p class="message" data-bind="html: messageContent" />
</div>

function WebmailViewModel() {
    // Data
    var self = this;
    self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
    self.chosenFolderId = ko.observable();
    self.chosenFolderData = ko.observable();
    self.chosenMailData = ko.observable();

    // Behaviours
    //self.goToFolder = function(folder) {
    //    self.chosenFolderId(folder);
    //    self.chosenMailData(null); // Stop showing a mail
    //    $.get('/mail', { folder: folder }, self.chosenFolderData);
    //};
    //self.goToMail = function(mail) {
    //    self.chosenFolderId(mail.folder);
    //    self.chosenFolderData(null); // Stop showing a folder
    //    $.get("/mail", { mailId: mail.id }, self.chosenMailData);
    //};
    self.goToFolder = function(folder) { location.hash = folder };
    self.goToMail = function(mail) { location.hash = mail.folder + '/' + mail.id };
    
    // Show inbox by default
    // self.goToFolder('Inbox');
    
    // Client-side routes    
    Sammy(function() {
        this.get('#:folder', function() {
            self.chosenFolderId(this.params.folder);
            self.chosenMailData(null);
            $.get("/mail", { folder: this.params.folder }, self.chosenFolderData);
        });

        this.get('#:folder/:mailId', function() {
            self.chosenFolderId(this.params.folder);
            self.chosenFolderData(null);
            $.get("/mail", { mailId: this.params.mailId }, self.chosenMailData);
        });
        
        this.get('', function() { this.app.runRoute('get', '#Inbox') });
    }).run();
};

ko.applyBindings(new WebmailViewModel());
分享到:
评论

相关推荐

    KnockoutJS中文文档新

    KnockoutJS中文文档新,chm格式的,文档比较新,chm格式也很方便使用

    KnockoutJS_3.xx版本

    Knockout(简称KO)是一个JavaScript库,可以帮助您用干净的底层数据模型创建丰富的反应迅速显示和编辑用户界面。任何时候你有UI的部分是动态更新(例如,根据用户的行为或者外部数据源的变化而变化),用KO可以帮助...

    KnockoutJS

    KnockoutJS包括mapping插件,成熟前端框架,结合Nhibernate使用,大幅减少数据绑定代码操作

    KnockoutJS Essentials(PACKT,2015)

    KnockoutJS is a Model View ViewModel (MVVM) framework that allows you to simplify the design of complex user. Knockout makes data manipulation simple and leads to maintainable web applications. ...

    KnockoutJS Web Development(PACKT,2015)

    This book is for web developers and designers who work with HTML and JavaScript to help them manage data and interactivity with data using KnockoutJS. Knowledge about jQuery will be useful but is not ...

    knockoutjs.chm 网站原版API and 示例

    从knockoutjs官网制作的可离线使用的API和示例。

    WebApi+Bootstrap+KnockoutJs打造单页面程序

    主要介绍了WebApi+Bootstrap+KnockoutJs打造单页面程序的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    [KnockoutJS] KnockoutJS 入门教程 (英文版)

    [Packt Publishing] KnockoutJS 入门教程 (英文版) [Packt Publishing] KnockoutJS Starter (E-Book) ☆ 出版信息:☆ [作者信息] Eric M. Barnard [出版机构] Packt Publishing [出版日期] 2012年11月23日 ...

    knockoutjs2.1.0

    knockoutjs,前台MVVM模式实现框架。knockoutjs能使前台数据源与html页面分离开来,让程序员专注于数据的变化。详情请参照knockoutjs.com。本文件于2012-7-31下载于knockout官方网站,版本号2.1.0

    KnockoutJS 3.X API 第四章之事件event绑定

    event绑定即为事件绑定,即当触发相关DOM事件的时候回调函数,这篇文章主要介绍了KnockoutJS 3.X API 第四章之事件event绑定的相关知识,感兴趣的朋友一起看看吧

    knockout-cookie:一个用于 KnockoutJS 的简单 jquery.cookie 扩展器

    淘汰赛饼干一个用于 KnockoutJS 的简单 jquery.cookie 扩展器用法在脚本导入中包含 javascript 文件knockout.cookie.js 。 使 observable 持久化它的值(基本上是一个会话)。 用cookie扩展它,它的值是存储 ...

    Asp.Net MVC 4 KnockoutJS 框架实例

    Asp.Net MVC 4 KnockoutJS 框架实例

    knockoutjs2.0入门.pdf

    。。。

    knockoutjs2.0入门.docx

    。。。

    Knockoutjs的环境搭建教程

    首先要到http://knockoutjs.com/index.html下载最新版本的Knockoutjs,笔者这里下载的是knockout-2.2.0.js。然后新建一个.html文件,在html文档中加入以下的语句导入此js: [removed][removed] 到这里我们就已经...

    KnockoutJS 官方文档汉化版

    KnockoutJs官方文档汉化完整版+Knockout精品文章,绝对超值

    KnockoutJs 帮助文档 中文手册

    KnockoutJs 官方文档汉化完整版手册 中文版 +Knockout精品文章 (如果有下载打不开的,请右键点击文件--》选择“属性”--》点击“解除锁定”,重新打开就可以了)

    knockoutjs-presentation:Knockout.js演示文稿

    警告如果您无话可说,那么impress.js可能对您没有帮助;)关于名字impress.js的名称。 Open / LibreOffice演示工具称为Impress是一个(不幸的)巧合;)版本历史0.5.3(, , )错误修复0.5版引入了包括impress:...

Global site tag (gtag.js) - Google Analytics