技术开发 频道

jQuery Mobile开发记事本应用第三季

  装载记事内容到记事页面

  下面,我们看下如何装载记事到记事编辑器中。当用户在记事列表中点某个记事时,我们分为下面几个步骤进行设计:

  在notesList数组中,根据在链接中的li元素中的id去找出对应的记事。

  在编辑界面的标题和内容文本框中,将读取到的记事的标题和内容放置到相应的文本框中。

  最后让记事编辑器页面处于激活状态

  而如果用户是点新建记事按钮,则执行相类似的步骤,只不过不用先根据notedid在记事列表中找出对应的记事而已,而是直接获得用户提交的记事标题和内容再予以保存。下面先看下如何实现装载已有的记事内容到记事编辑页中。

  首先,我们要在控制器的声明部分中,定义如下的页面变量:

  var noteEditorPageId = "note-editor-page";

  接下来,我们在onPageChange()方法中编写相关的事件处理代码,专门用于处理在记事列表页面跳转到记事编辑页面:

var onPageChange = function (event, data) {
    var toPageId
= data.toPage.attr("id");
    var fromPageId
= null;
    
if (data.options.fromPage) {
        fromPageId
= data.options.fromPage.attr("id");
    }
    switch (toPageId) {
        
case notesListPageId:
            resetCurrentNote();
            renderNotesList();
            break;
      
case noteEditorPageId:
            
if (fromPageId === notesListPageId) {
                renderSelectedNote(data);
            }
            break;
    }
};

  下面解析下上面的代码,其中我们定义了fromPageId这个参数,今后我们简称为源页面,而toPageId则称之为目标页面。其中fromPageId的值会判断是否在记事编辑界面中加载记事内容:

  if (fromPageId === notesListPageId) {

  renderSelectedNote(data);

  }

  这段代码判断了如果源页面来自记事列表页面,则通过renderSelectedNote方法读取具体的某个记事内容(这个方法稍后编写)。要注意的是,在应用启动后,pagechange 事件就发生了,但这个时候源页面为空,所以必须通过下面的代码,首先获得页面的id,如下:

  if (data.options.fromPage) {

  fromPageId
= data.options.fromPage.attr("id");

  }

  接下来,我们编写核心的从记事列表中装载记事的代码,即renderSelectedNote方法:

var renderSelectedNote = function (data) {
    var u
= $.mobile.path.parseUrl(data.options.fromPage.context.URL);
    var re
= "^#" + noteEditorPageId;
    
if (u.hash.search(re) !== -1) {
        var queryStringObj
= queryStringToObject(data.options.queryString);
        var titleEditor
= $(noteTitleEditorSel);
        var narrativeEditor
= $(noteNarrativeEditorSel);
        var noteId
= queryStringObj["noteId"];
        
if (typeof noteId !== "undefined") {
                  var notesList
= dataContext.getNotesList();
            var notesCount
= notesList.length;
            var note;
            
for (var i = 0; i < notesCount; i++) {
                note
= notesList[i];
                
if (noteId === note.id) {
                    titleEditor.val(note.title);
                    narrativeEditor.val(note.narrative);
                    currentNote
= note;
                }
            }
        }
else {
        
//新建一个记事,设置标题文本框和记事文本框初始内容为空
            titleEditor.val(
"");
            narrativeEditor.val(
"");
        }
        titleEditor.focus();
    }
};

  在上面的代码中,首先判断来源页面是否为记事列表页面,其中使用了如下的通过正则表达式的方法判断:

var u = $.mobile.path.parseUrl(data.options.fromPage.context.URL);
    var re
= "^#" + noteEditorPageId;
    
if (u.hash.search(re) !== -1) {
    …    }

  这里通过了jQuery Mobile的parseUrl方法(见http://jquerymobile.com/test/docs/api/methods.html)首先获得了来源的URL,存放到变量u中,并且通过正则表达式的判断方法进行判断。接着我们创建一个对象,用来存放相对应的来源URL,这通过一个助手类queryStringToObjec

  t来实现,代码如下:

    var queryStringToObject = function (queryString) {
    var queryStringObj
= {};
    var e;
var a
= /\+/g;  
var r
= /([^&;=]+)=?([^&;]*)/g;
    var d
= function (s) { return decodeURIComponent(s.replace(a, " ")); };
    e
= r.exec(queryString);
    
while (e) {
        queryStringObj[d(e[
1])] = d(e[2]);
        e
= r.exec(queryString);
    }
    return queryStringObj;
};

  然后在使用时,通过var queryStringObj = queryStringToObject(data.options.queryString);进行调用,获得的是上一个页面传进来的字符串参数对象,再通过var noteId = queryStringObj["noteId"];获得了要查看编辑的记事的notedId。再来分析以下这段代码:

  if (typeof noteId !== "undefined") {
       var notesList
= dataContext.getNotesList();
    var notesCount
= notesList.length;
    var note;
    
for (var i = 0; i < notesCount; i++) {
        note
= notesList[i];
        
if (noteId === note.id) {
            currentNote
= note;
            titleEditor.val(currentNote.title);
            narrativeEditor.val(currentNote.narrative);
        }
    }
}
else {
        titleEditor.val(
"");
    narrativeEditor.val(
"");
}

  这里首先判断notedId是否已定义,如果不为空且已定义,则证明为加载编辑记事,通过dataContext数据模块加载记事列表,然后通过循环找出notedId为要查看记事id的记事

  ,注意这里使用currentNode变量保存了要查看的notes对象,这样就为后面增加和删除提供了方便,不用再次在noteList数组中再寻找。

  运行后,当点记事列表中的某个记事时,则会出现具体的记事内容,如下图:

装载记事内容到记事页面
 

0
相关文章