Part 7: 編輯任務列表
準備
開始本教程之前,你需要了解以下幾點:
- alexyoung / dailyjs-backbone-tutorial提交到了465523f版本
- 第二部分中的API key
- 第二部分中的“Client ID”
- 更新
app/js/config.js
成你自己的key(如果你檢出了我的程式碼)
要檢出原始碼,請執行以下命令(或用Git GUI工具):
git clone git@github.com:alexyoung/dailyjs-backbone-tutorial.git
cd dailyjs-backbone-tutorial
git reset --hard 465523f
當前任務列表
在前幾個部分,我們用Backbone.sync
實現了creat
方法和怎麼新建一個任務到檢視模板中,如你還記得我們通過繼承AddListView
新建編輯任務列表的檢視,因為新建和編輯差不多
編輯任務列表之前我們需要一個方法把選中和狀態儲存起來,這樣即使我們從伺服器端拿任務列表,我也會有一個預設被選中的任務列表。
我們新建一個新的models
物件通過檢查集合和檢視來實現這個,其中可以有個activeList
.
在app/js/app.js
中新增一個models
屬性,任務列表載入後設定activemodel
:
App.prototype = {
views: {},
collections: {},
models: {},
connectGapi: function() {
var self = this;
this.apiManager = new ApiManager(this);
this.apiManager.on('ready', function() {
self.collections.lists.fetch({ data: { userId: '@me' }, success: function(res) {
self.models.activeList = self.collections.lists.first();
self.views.listMenu.render();
}});
});
}
};
app/js/views/lists/menu.js
保證activeModel
當工作列導航渲染的時候被使用:
renderMenuItem: function(model) {
var item = new ListMenuItemView({ model: model });
this.$el.append(item.render().el);
if (model.get('id') === bTask.models.activeList.get('id')) {
item.open();
}
},
如果模型和當前這個想相同則open
這個檢視。修改app/js/views/lists/menuitem.js
確保ListMenuItemView
能夠檢查到activeModel
:
open: function() {
bTask.models.activeList = this.model;
return false;
}
現在我們就實現了展開我們被選中的任務列表了,這樣新建的任務就可以很容易加到你當前選中的列表中
編輯任務列表表單
當我們點選“編輯”連結時,需要給表單填充需要修改的任務資料,這樣我們才能修改,這個有點像addList
方法
開啟app/js/views/app.js
, 新增依賴EditListView
模組:
define([
'text!templates/app.html'
, 'views/lists/add'
, 'views/lists/edit'
],
function(template, AddListView, EditListView) {
給#edit-list-button
按鈕新增事件:
events: {
'click #add-list-button': 'addList'
, 'click #edit-list-button': 'editList'
},
最好activeList
基礎是上,新增EditListView
表單的一個例項化方法editList
:
editList: function() {
var form = new EditListView({ model: bTask.models.activeList });
this.$el.find('#list-editor').html(form.render().el);
form.$el.find('input:first').focus();
return false;
}
這個方法和addList
有點類似,他可以用於不同的模型:
listForm: function(form) {
this.$el.find('#list-editor').html(form.render().el);
form.$el.find('input:first').focus();
return false;
},
addList: function() {
return this.listForm(new AddListView({ model: new bTask.collections.lists.model({ title: '' }) }));
},
editList: function() {
return this.listForm(new EditListView({ model: bTask.models.activeList }));
}
DRY!(設計模式中不用重複自己)
儲存修改
和(app/js/gapi.js
)新建差不多,任務被修改需要通過Backbone.sync
更新:
// Around line 97, after 'create'
case 'update':
requestContent['resource'] = model.toJSON();
request = gapi.client.tasks[model.url].update(requestContent);
Backbone.gapiRequest(request, method, model, options);
break;
通過用Google’s API的tasklist來實現update
方法,詳細的文件在這裡(asklists/update)
相對於用Backbone模型把這段邏輯放到Backbone.sync
比較好些,因為和google相關的都在這個地方.
可以用switch
根據不同模型的url實現獲取模型ID引數並插入。
Backbone.sync = function(method, model, options) {
var requestContent = {};
options || (options = {});
switch (model.url) {
case 'tasks':
requestContent.task = model.get('id');
break;
case 'tasklists':
requestContent.tasklist = model.get('id');
break;
}
現在任務列表就可編輯了,但有一件事沒有做—給選中的列表新增“active”狀態。
當前選中的任務列表
開啟app/js/views/lists/menuitem.js
修改open
方法,當你選中導航列表時給當前選中的新增一個類名:
open: function() {
if (bTask.views.activeListMenuItem) {
bTask.views.activeListMenuItem.$el.removeClass('active');
}
bTask.models.activeList = this.model;
bTask.views.activeListMenuItem = this;
this.$el.addClass('active');
return false;
}
bTask.views.activeListMenuItem
用於儲存被開啟的當前的檢視。需要注意下這裡我們用的是this.$el
。儘量的少用jQuery更多得用Backbone來替代,因為$()
是jQuery的用於查詢元素用。
要我為什麼用bTask.views.activeListMenuItem
儲存引用而不是$('.list-menu-item').removeClass('active'),我也很難講—畢竟jQuery在也有一定的用處
這個就引出另一個問題:我們到底用什麼去儲存對一個模型的引用了?我們現在用的是ListMenuItemView
,大多數情況下Backbone更專注於模型的UI介面相對於它的內部狀態。我們試試刪除對bTask.models
的引用。
開啟app/js/app.js
刪除設定activeList
那行和models
物件。然後修改app/js/views/lists/menuitem.js
的open
方法:
open: function() {
if (bTask.views.activeListMenuItem) {
bTask.views.activeListMenuItem.$el.removeClass('active');
}
bTask.views.activeListMenuItem = this;
this.$el.addClass('active');
return false;
}
接下來開啟app/js/views/app.js
修改AppView
類,確定editList
使用的是bTask.views.activeListMenuItem.model
,最後,在app/js/views/lists/menu.js
啟用預設項:
renderMenuItem: function(model) {
var item = new ListMenuItemView({ model: model });
this.$el.append(item.render().el);
if (!bTask.views.activeListMenuItem) {
bTask.views.activeListMenuItem = item;
}
if (model.get('id') === bTask.views.activeListMenuItem.model.get('id')) {
item.open();
}
},
我覺得在Backbone中,應該不儲存應用程式內部狀態,而是通過檢視上的類名來實現,這樣可以簡化應用程式內部的邏輯。
為了使介面上看起來更明顯,我們在app/css/app.css
新增li.active { font-weight: bold }
樣式
總結
這個部分我們基於Part 6實現了對任務列表的編輯,我們還得跟蹤當前修改具體是那個任務列表。
你還知道了為什麼用this.$el
而$()
來儲存元素的引用的原因,同時我們還了解到:在檢視中通過類來儲存它的狀態,避免與外部的互動的好處。
教程中完整的程式碼可以在這裡找到:alexyoung / dailyjs-backbone-tutorial, commit 0953c5d
相關文章
- 8086 彙編學習 Part 7
- 列表頁取出刪除編輯功能
- 仿 iOS 列表的編輯功能 – 排序篇iOS排序
- 仿 iOS 列表的編輯功能 – 刪除篇iOS
- C++--Win32--列表編輯--獲取列表內容--獲取列表行數--修改列表內容C++Win32
- Java編寫定時任務Java
- 非同步任務編排CompletableFuture非同步
- CentOS7 vi編輯命令【轉】CentOS
- Laravel-admin 中列表中禁止某行編輯、刪除Laravel
- HarmonyOS NEXT應用開發案例——列表編輯實現
- centos7安裝vim編輯器CentOS
- 18項任務200萬影片編輯對,雲天勵飛聯合多高校打造出大規模編輯資料集
- Laravel 5.4 入門系列 3. 任務列表顯示Laravel
- 使用 Vim 管理任務列表和訪問 Reddit 和 Twitter
- 前端列表可編輯的實現與最佳化(下)前端
- 基於Hyperf開發的任務排程系統.支援任務投遞,DAG任務編排(多個任務使用同一個事務).
- Linux(CentOS7)使用vim編輯檔案LinuxCentOS
- PDFsam Enhanced 7,專業PDF編輯軟體
- centos7 vim 編輯Dockerfile顯示高亮CentOSDocker
- 今天,總監說要一個任務排程的列表。
- CCL 2024 Task7 雙任務冠軍
- 1.2.7. 任務7:資料庫設計資料庫
- [譯] part 7: golang 包Golang
- 在近期任務列表顯示單個APP的多個ActivityAPP
- win7如何開啟組策略編輯器?Win7系統開啟組策略編輯器的操作步驟Win7
- 任務佇列,巨集任務與微任務佇列
- Laravel 7使用swoole+redis每秒處理任務LaravelRedis
- 優秀的數字音訊編輯器:Acoustica 7 for mac音訊Mac
- Centos 7 檢視本機IP 編輯IP 修改ipCentOS
- 從 Turborepo 看 Monorepo 工具的任務編排能力Mono
- Study Plan For Algorithms - Part7Go
- 編輯個人資料+粉絲/關注/收藏/歷史閱讀列表
- 編輯
- CNN也能用於NLP任務,一文簡述文字分類任務的7個模型CNN文字分類模型
- CVPR 2024高分論文:全新生成式編輯框架GenN2N,統一NeRF轉換任務框架
- 巨集任務和微任務
- 【編測編學】零基礎學python_09_列表(操作列表之遍歷列表)Python
- 實習任務之使用react實現登入獲取動態列表React
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步