上一篇我們實現了文件的新建,保存,打開功能.
在這篇里我們將實現以下功能:
- 系統模塊,包含一些軟件的設置和存儲功能
- 記錄上次打開的文件
- 編輯器樣式選擇
系統模塊
跟之前的studio
模塊類似,我們在modules模塊下增加system
目錄.
比studio多了model.js
文件,用來實現系統模塊的一些功能.
在app.js
里加載system
模塊
1 |
angular.module('hmd', ['ui.router','hmd.directives','hmd.studio','hmd.system']) |
路由、導航欄angular.js
用得不熟,導航欄的狀態根據route來切換一直不知道怎么實現比較優雅.
我直接在app.js
里增加了一個導航欄切換的方法,每個route的onEnter事件里自行調用這個方法.
1 |
//TODO:更優雅的導航欄切換邏輯 |
system/route.js
1 |
hmd.system.config(function ($stateProvider, $urlRouterProvider) { |
studio/route.js
1 |
... |
然后在index.html
里配置好導航
1 |
... |
記錄上次打開的文件
每次打開文件都會被記住,下次重新啟動程序時將默認打開最后一次打開的文件.
system設置的讀取和保存
我們先在system/model.js
實現保存和讀取設置的功能.
1 |
var util = require('./helpers/util'), |
system
實現了get
和save
方法,所有的設置都存儲在一個簡單的對象里,代碼里並沒有對這個對象做緩存,每次都是從文件里讀取,因為這簡單的文件還遠達不到影響讀取速度的情況.
然后我們修改editor
的setFile
方法,暴露setFiled
事件給外部使用.
1 |
//設置當前文件 |
最后修改studio/directives.js
的hmdEditor
,實現這個功能.
1 |
studio.directive('hmdEditor', function () { |
編輯器樣式選擇
樣式修改表單
樣式文件在目錄app/lib/codemirror/theme.
目錄里每一個樣式文件代表一種編輯器樣式,還記得當初實現editor
的init
時,樣式已經是通過配置傳入的.
1 |
... |
現在我們只要把theme參數存儲到配置里,並提供給用戶修改就可以.
在system/model.js
里的默認配置增加一個theme
字段.
1 |
... |
修改system/views/system.html
模版,增加樣式表單
1 |
<div class="content studio-wrap"> |
這里的select控件我們先寫了3個選項.現在先實現這個修改樣式的功能,等完成這個功能后再把選項列表做成自動生成.
對應的system/controllers.js
(開發了3天了,終於第一次用到controller了)
1 |
system.controller('system', function ($scope) { |
controller
里讀取system的數據,並賦值給$scope.systemSetting
,用於表單的數據綁定.由於angular
實現了數據的雙向綁定,因此用戶編輯表單時,綁定的數據也會跟着更新.這樣我們的save
方法里只要將表單綁定的數據保存回system即可.
button按鈕綁定save方法ng-click="save(systemSetting)"
.
這里可以稍微感受到angular
讓我們節省了很多工作量.
自動生成select列表
修改controller
1 |
var system = hmd.system, |
從theme
目錄里讀取所有樣式列表,生成鍵值對,然后賦值給$scope.themes
修改視圖模版:
1 |
<select name="theme" ng-model="systemSetting.theme" ng-options="k as v for (k, v) in themes"> |
ng-options="k as v for (k, v) in themes"
是angular的綁定語法
這樣我們就實現了樣式列表的自動讀取,用戶如果想自定義樣式,只要在app/lib/codemirror/theme
目錄新增一個樣式文件,並寫上自己的樣式就可以在系統設置里選擇自定義的樣式了.
總結
今天實現了記憶最后一次打開的文件以及樣式選擇的功能,並且第一次使用了angular
的controller
,感受到了angular
雙向數據綁定的強大.
我們的程序又更好用一些了(但是隨着界面變多,又更丑了,太為難了).