技术开发 频道

jQuery Mobile开发记事本应用四大技巧

  设计删除记事功能

  接下来,我们要设计删除某一个记事的功能,设计好的界面如下图:

设计删除记事功能

  当用户按delete按钮后,弹出如下界面:

设计删除记事功能

  当用户选No时,则返回查看记事具体内容的界面,如果选择的是YES,则删除一条记事。

  首先我们在index.html中,设计删除信息提示的界面,如下:

<div id="confirm-delete-note-dialog" data-role="dialog" data-title="Delete Note">
<div data-role="header">
<h1>Delete Note?</h1>
</div>
<div data-role="content">
<div id="delete-note-content-placeholder"></div>
<a id="cancel-delete-note-button" data-role="button" data-theme="b" data-rel="back">No</a>
<a id="ok-to-delete-note-button" data-role="button" data-theme="f">Yes</a></div>
</div>

  注意我们使用了data-role=”dialog”属性,这个之前谈到的一样,让框架输出一个对话框风格的页面。之后在Yes和No的按钮中,注意使用了data-role=”button”的方法,并指出了每个按钮的data-theme的风格样式,其中b和f都是jQuery Mobile内置的CSS样式,当然用户可以自己修改。

  跟之前一样,我们要在控制层中控制这个删除界面的行为,同样首先定义删除界面的标识如下:

  var confirmDeleteNoteDlgSel = "#confirm-delete-note-dialog";

  再将在编辑记事页面中的删除按钮以及删除界面中的确认按钮、在删除确认界面中的一个DIV都定义一个别名标识,如下:

  var deleteNoteButtonSel = "#delete-note-button",

  deleteNoteContentPlaceholderSel = "#delete-note-content-placeholder",

  okToDeleteNoteButtonSel = "#ok-to-delete-note-button";

  接下来,我们编写删除按钮的基本事件框架如下:

  var init = function () {

  
// 其余省略的代码

  d.delegate(deleteNoteButtonSel,
"tap", onDeleteNoteButtonTapped);

  };

  其中onDeleteNoteButtonTapped代码如下:

  var onDeleteNoteButtonTapped
= function () {

  
if (currentNote) {

  var noteContentPlaceholder
= $(deleteNoteContentPlaceholderSel);

  noteContentPlaceholder.empty();

  $(
"

  
" + currentNote.title + "

  
" + currentNote.narrative + "

  
").appendTo(noteContentPlaceholder);

  $.mobile.changePage(confirmDeleteNoteDlgSel, defaultDlgTrsn);

  }

  };

  在onDeleteNotebuttonTapped()方法中,首先我们读取了当前即将要被删除的记事,然后将其添加到placeholder这个div中,并且再使用changePage方法让当前界面成为焦点界面,这个之前的论述是一样的。

  接下来,再分别看下当用户点NO或YES时,如何进行事件的处理。当用户点NO按钮时,

  页面的代码为:

<a id="cancel-delete-note-button" data-role="button" data-theme="b" data-rel="back">No</a>

  其中的data-rel=”back”是内置的功能,能自动回退到上一个页面,而这正是我们所需要的。

  而在YES按钮的事件处理中,当用户点YES后,需要删除记事后再带用户回到记事列表,并且刷新此时的记事列表。同样在控制层中的init方法中加入如下代码:

    var init = function () {
    
//省略其他代码
    d.delegate(okToDeleteNoteButtonSel,
"tap", onOKToDeleteNoteButtonTapped);
};
接下来定义onOKToDeleteNoteButtonTapped方法,如下:
  var onOKToDeleteNoteButtonTapped
= function () {
    dataContext.deleteNote(currentNote);
    returnToNotesListPage();
};

  这个很容易理解,其中调用了dataContext中的deleteNote方法删除一个真正的记事,然后再调用returnToNotesListPage()返回记事列表。在编写deleteNote方法前,先继续编写单元测试用例如下:

     it("Removes a note from local storage", function () {
        
// 创建记事
        var dateCreated
= new Date();
        var id
= new String(dateCreated.getTime());
        var noteModel
= new Notes.NoteModel({
            id: id,
            dateCreated: dateCreated,
            title:
"",
            narrative:
""
        });
        
// 清空记事列表
        var notesList
= [];
        
// 添加到localstorage本地存储
        notesList.push(noteModel);
        $.jStorage.set(notesListStorageKey, notesList);
        notesList
= $.jStorage.get(notesListStorageKey);
        expect(notesList.length).toEqual(
1);
        
// 删除记事
        Notes.dataContext.init(notesListStorageKey);
        Notes.dataContext.deleteNote(noteModel);
        
// 删除后应该返回空的列表,断言判断
        notesList
= $.jStorage.get(notesListStorageKey);
        expect(notesList.length).toEqual(
0);
        
// 清除相关资源
        $.jStorage.deleteKey(notesListStorageKey);
    });
    运行测试后当然结果是失败的,因为没有编写deleteNote方法。因此编写代码如下:
var deleteNote
= function (noteModel) {

    var i;
    
for (i = 0; i < notesList.length; i += 1) {
        
if (notesList[i].id === noteModel.id) {
            notesList.splice(i,
1);
            i
= notesList.length;
        }
    }

    saveNotesToLocalStorage();
};

  这里就是通过循环遍历数组的方法,根据notedId找出要删除的元素,然后通过数组的splice方法进行删除,删除后记得调用saveNotesToLocalStorage();

  方法进行保存。为了方便在模块的接口处进行调用,我们添加到controller.js中:

  var pub = {
    init: init,
    createBlankNote: createBlankNote,
    getNotesList: getNotesList,
    saveNote: saveNote,
    deleteNote: deleteNote
};

  再运行测试,可以看到顺利通过。如下图:

设计删除记事功能

1
相关文章