2020年4月28日 星期二

[Vue]雙向綁定說明


Vue是使用JS原生的Object.defineProperty() 來實現雙向綁定,

其中會產生相對應的get() set()方法,作為底層監控資料的變化。(其實ES6的Proxy也可達到同樣效果)
下面提供一個範例

//JS
var model = {}
let value = undefined
Object.defineProperty(model, "value", {
get(){
return value;
},
set(newVal) {
value = newVal;
document.getElementById("input").value = newVal
document.getElementById("display").innerHTML = newVal
}
})
document.getElementById("input").addEventListener("keyup", function (event) {
model.value = event.target.value;
console.log("綁定的資料異動:",model.value)
})
//HTML
畫面:


Vue架構

首先我們都知道Vue是基於MVVM的架構如下圖,分別為View,ViewModel,Model,這麼做有什麼好處呢,我們知道以前也有個MVC的架構,在MVC架構下我們元件都是共用在複雜邏輯的畫面時就會造成以下圖的問題,有時候光要找問題就很頭痛了,所以才衍生出現在有MVVM或是Flux架構,這邊我們我們講Vue就來說說MVVM架構,多個ViewModel就有點像個中繼站負責我們View跟Model之間的橋樑

MVC:



MVVM:




簡單解釋如下:
View:
為我們UI的部分負責呈現我們DOM
ViewModel:
為負責同步View及Model之間的橋樑,讓畫面的更新可以即時同步到資料上
Model:
就是我們的資料


vue實際做法
至於綁定的實際做法細節還分為以下做解釋,如下圖






Observer相當於Model層觀察vue實例中的data數據,當數據發生變化時,通知Watcher訂閱者。


Compile指令解析器位於View層,初始化View的視圖,將數據變化與更新函數綁定,傳給Watcher訂閱者。


Watcher是整個模型的核心,對應ViewModel層,連接Observer和Compile。所有的Watchers存於Dep訂閱器中,Watcher將Observer監聽到的數據變化對應相應的回調函數,處理數據,反饋給View層更新界面視圖。




參考文章:

[Webix] 第四章:Practice

實作說明:目前參考公司專案{TOGO}的混合式APP當成實作練習,原先架構為MVC+JQuery Mobile。

程式架構:
MVC+Webix
程式說明:
Header和Footer實作於_Layout.cshtml,中間頁面採取Razor寫法,用@RenderBody去定義每個功能的頁面。
Ex. _Layout.cshtml
<header>
</header>

<body>
@RenderBody
</body>

<Footer>
</Footer>

中間頁面的內頁切換是採取Webix的'MultiView'方式,概念類似於Jquery Mobile的Page。
因MultiView有支援Animation,切換時就可使用動畫方式作切換,不設定時預設是滑動(type:'slide')。

範例程式碼:
webix.ui({
rows:[
{
view:'button',
label:'GoPage1',
click :function(){
$$("Multi").setValue("Page1");
}
},
{
view:'button',
label:'GoPage2',
click :function(){
$$("Multi").setValue("Page2");
}
}
,
{
id:'Multi',
cells:[
{
id:'Page1',template:'Page1'
},
{
id:'Page2',template:'Page2'
}
]
}]
}
);


呈現畫面:


2020年4月16日 星期四

[Webix Jet]第三章:多語言

Webix Jet有很多Plugins,其中Locale Plugin就可以實現多語言

在App尚未渲染畫面前,先載入Locale Plugin

// myapp.js
import {JetApp, plugins} from "webix-jet";
...
app.use(plugins.Locale);
app.render();

需新增一格Locale的資料夾,並且在裡面新增語言的JS檔(以下為中文語言的範例檔)

// locales/zh.js
export default {
"My Profile" : "我的個人資料",
"My Account" : "我的帳戶",
"My Calendar" : "我的日曆"
};

語言預設為英文,如果要換語言需啟用對應的語系檔

// app.js
app.use(plugins.Locale,{ lang:"zh" });

要翻譯所有文字,您需要將所有的_()方法應用於每個標籤。 該方法採用一個參數對應一個文字。
_()在語言環境文件中查找文字並返回翻譯。 例如。 如果選擇了中文,則this.app.getService \(“ locale” \)。\ _ \(“My Profile” \)將返回“我的個人資料”。
例如,讓我們將_()方法應用於菜單:

// views/menu.js
import {JetView} from "webix-jet";
export default class MenuView extends JetView {
config(){
const _ = this.app.getService("locale")._;
return {
view:"menu", data:[
{ id:"profile", value:"My Profile" },
{ id:"account", value:"My Account" },
{ id:"calendar", value:"My Calendar" }
],
template:(obj)=>{
return _(obj.value)};
}
};
}
}

動態切換語言

想要讓使用者自由切換語言,可使用setLang()來切換目前的語言。

注意!
不要在JetView的生命週期處理程序中調用setLang()! 它使用app.refresh()會重新整理所有視圖,這將會造成無限循環。

讓我們為應用程序設置創建一個簡單的頁面,該頁面帶有用於選擇語言的分段按鈕。 請注意,按鈕選項的ID應該與語言環境文件名相同(例如“ es”,“ zh”)。

// views/settings.js
import {JetView} from "webix-jet";

export default class SettingsView extends JetView {
config(){
return {
type:"space", rows:[
{ template:"Settings", type:"header" },
{ name:"lang", optionWidth: 120, view:"segmented", label:"Language", options:[
{ id:"en", value:"English" },
{ id:"zh", value:"中文" }
], click:() => this.toggleLanguage() }, //will be implemented as a method of this class
{}
]
};
}
}

View畫面



點選後中文後,網頁有使用翻譯功能就可以對應語言檔去顯示文字。

官網說明:

[Webix Jet]第二章:Getting Started

環境建置需求:
1.安裝Nodejs

2.下載Demo SourceCode
可依需求找出最相近的Demo。

3.下載後在資料夾內下CMD指令
npm install
npm run start
執行完後就會預設使用8080Port的可執行環境。

網址輸入Localhost:8080即可觀看Demo長相(範例使用Banking APP)




下面說明幾個重要檔案

1.MyApp.js
說明:主要的設定都在此檔裡

// myapp.js
import { JetApp, EmptyRouter, HashRouter } from "webix-jet";
export default class MyApp extends JetApp{
constructor(config){
const defaults = {
router: BUILD_AS_MODULE ? EmptyRouter : HashRouter,
debug: !PRODUCTION,
start: "/top/layout"
};
super({ ...defaults, ...config });
}
}
if (!BUILD_AS_MODULE){
webix.ready(() => new MyApp().render() ); // mandatory!
}

2.webpack.config.js
說明:WebPack設定檔,主要設定輸入和輸出位置。

//webpack.config.js
{
entry: {
myapp: "./sources/myapp.js"
},
output: {
path:"cdoebase",
filename: "[name].js"
}
}

2020年4月14日 星期二

[Webix Jet] 第一章:Introdution

因為系統的功能持續擴大,導致Webix組件一個個新增,程式碼的複雜度會隨之提升,未來會造成維護不易的情況。
才會衍生出Webix Jet框架用模組化方式去管理一個個View(類似於Vue概念)。

Jet的架構是SPA(Single-Page-Application),會使用WebPack元件將程式碼包裝成單一JS檔跟CSS檔。
開發前要使用NPM來安裝WebPack外掛套件(需安裝Node.js)
Jet的畫面所有區域都各自為一個View,各自做完後用ES6的Export、Import方式來去做顯示,如同下圖(截自官網)





[Webix] 第三章:Widgets -總結

Webix提供的元件這麼多,要怎麼快速選擇自已想要的是快速開發的基本原則(如果無法快速開發也不需使用此函示庫了~)。

這邊簡單分類所有元件(同官網分類),可從中尋找自己所需元件。

版面元件:

Accordion、Carousel、Dashboard、Form、HTMLForm、Layout、MultiView、Portlet、ScrollView、TabView

導覽元件:

ContextMenu、Hint、Menu、Sidebar、SideMenu、Toobar

視窗元件:

Context、Popup、Tooltip、Window

資料元件:

Comments、DataTable、DataView、GroupList、List、Property Sheet、Query Builder、Filter、Tree、TreeTablereeTable、UnitList、TimeLine

控制元件:

Button、Calender、CheckBox、ColorBoard、ColorPicker、Combo、Counter、DataSuggest、DatePicker、DataRange、DataRangePicker、DataRangeSuggest、
DoubleList、Fieldset、FormInput、GridSuggest、icon、Label、Mentionsuggest、MultiCombo、MultiSelect、MultiText、Pager、Radio、RangeSlider、RichSelect、RichText、Search、Segmented、Select、Slider、Suggest、Switch、Tabber、Text、TextArea、TextHighLight、Toggle、Uploader

因公司有換版的需求,這邊列出幾種類別跟畫面提供給公司內部做換版選擇

(一)菜單
需求:因菜單長相會因功能多寡變動,SideMenu這邊分成兩種做顯示。
1.menu


2.sidemenu(List)


3.sideMenu(Tree)


(二)下拉元件
1.Select(單選)


2.MultiCombo(多選)


3.RichSelect(不可編輯的)


(三)資料顯示
1.DataTable(有Header)


2.DataView(無Header)


[Webix] 第三章:Widgets - 2.Form

表單元件,提供驗證和送出後端的功能。

畫面呈現:

程式碼:
webix.ui({
view:"form",
id:"log_form",
width:300,
elements:[
{ view:"text", label:"Email", name:"email"},
{ view:"text", type:"password", label:"Password", name:"password"},
{ margin:5, cols:[
{ view:"button", value:"Login" , css:"webix_primary"},
{ view:"button", value:"Cancel"}
]}
]
});


重要屬性

elements:元素,為陣列形式做設定。

重要方法

getValues():取得表單資料。

同場加映(使用Form資料呼叫API方式):
1.使用Webix Ajax 套件
webix.ajax().post("some.php", form.getValues());
//with callback
webix.ajax().post("some.php", form.getValues(), function(text, data, xhr){ });
2.使用Webix.send模擬HTMLForm的Submit方式。
webix.send("come.php", form.getValues());









相關文章:

[Webix] 第一章:Introdution

[Webix] 第二章:Layout

[Webix] 第三章:Widgets


[Webix] 第三章:Widgets - 5.Menu

菜單元件,同類型的還有SideMenu

畫面呈現:

程式碼:
var menu = webix.ui({
view:"menu",
data:[
{id:1, value:"Translate", submenu:["English", "French", "German"]},
{id:2, value:"Post"},
{id:3, value:"Info"}
],
type:{
subsign:true,
}
});

重要屬性

data:資料來源,可以是Json或是JSArray。(id為鍵值,Value代表顯示文字)
value:預設選取,對應options的id值。

重要事件

onMenuItemClick:點選菜單觸發,回傳點選的id值,可使用getMenuItem抓取。

重要方法

parse():帶入資料。
getValue():抓取目前選取的id值(物件沒id值時會抓取Value)。

[Webix] 第三章:Widgets - 4.Select

單選下拉元件,不支援Mutile-Select。

畫面呈現:

程式碼:
var select = webix.ui({
view:"select",
label:"Branch",
value:1, options:[
{ "id":1, "value":"Master" },
{ "id":2, "value":"Release" }
]
});


重要屬性

options:資料來源,可以是Json或是JSArray。(id為鍵值,Value代表顯示文字)
value:預設選取,對應options的id值。

重要方法

define:帶入資料。
getValue:抓取目前選取的id值(物件沒id值時會抓取Value)。


相關文章:

[Webix] 第一章:Introdution

[Webix] 第二章:Layout

[Webix] 第三章:Widgets

[Webix] 第三章:Widgets - 3.List

Webix列表是一個與UI相關的組件,它從視圖繼承並顯示列出的數據項。
Webix庫提供除標準列表以外的三種列表變體-GroupList,X-List和UnitList。

畫面呈現:

程式碼:
webix.ui({
view:"list",
template:"...",
data:..//variable || path || dataset
});

重要屬性

data:資料來源,來源格式可使用XML、JSON、CSV、JSArray、HTML Tables...etc。
template:可依照資料格式做自定義顯示,使用方式是使用#包覆。(例:#{ColumnName}#)

重要事件

onItemClick:點選某筆資料時觸發,通常搭配SideMenu使用。

重要方法

parse:帶入資料。
clearAll:清除資料。

[Webix] 第三章:Widgets

Webix UI庫提供了90多個完全可自定義的小部件和控件,以幫助您構建各種類型的界面,很好地呈現數據並使用它。 還有一些有用的擴展,可以與
第三方工具和特定功能,使您的應用程序外觀漂亮且體驗友好。

所有窗口小部件都是使用webix.ui()構造函數製成的對象,其中窗口小部件的類型由'view'屬性設置(聲明性語法也可用)。

var dtable = webix.ui({ view:"datatable", ... });

元件一覽:


元件種類有多種,其中挑出幾個比較常用的做說明,如下列清單:
2.Form

[Webix] 第二章:Layout

Layout是一個概念元素,它本身不包含任何內容,但決定了“有意義的”組件的排列方式。
它將頁面分為行(rows)和列(columns),所有其他組件(widgets)都放在其中。



程式碼範例:
webix.ui({
container:"layout_div", // corresponds to the id of the div block
rows:[
{template:"row 1"}, // here you place any component you like
{template:"row 2"},
{ cols:[
{ template:"col 1" },
{ template:"col 2" },
{ template:"col 3" }
]}
]
});

2020年4月13日 星期一

[Webix] 第一章:Introdution



Webix是一個Javascript UI組件庫,用於加速開發Web。

透過簡單設定即可在畫面上新增好看的控制元件,如下以下範例。

語法範例:
  • 建立一個簡單的HTML頁面,並且指定為HTML5的格式。
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" href="//cdn.webix.com/edge/webix.css" type="text/css">
<script src="//cdn.webix.com/edge/webix.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript" charset="utf-8">
/* place for UI configuration */
</script>
</body>
</html>
  • 定義 UI的屬性(這邊使用DataTable)
webix.ui({
rows:[
{ view:"template",
type:"header", template:"My App!" },
{ view:"datatable",
autoConfig:true,
data:{
title:"My Fair Lady", year:1964, votes:533848, rating:8.9, rank:5
}
}
]
});

輸出畫面:



2020年4月12日 星期日

[Webix] 第三章:Widgets - 1.DataTable


DataTable提供專業的外觀和便捷的模型,用於在可滾動和可排序的資料表中顯示數據。
它是一個功能強大但易於使用的組件,它支持不同的數據源(XML,JSON,CSV,JSArray,HTML Tables)。
數據表具有多種可能性(過濾,排序,分頁,調整大小,樣式,複製等),並且在處理成千上萬條記錄方面仍然非常好且快速。

畫面呈現:



程式碼:

webix.ui({
type:"wide",
rows:[
{
view:"datatable",
columns:[
{ id:"rank", header:"", css:"rank", width:50},
{ id:"title", header:"Film title", fillspace:true},
{ id:"year", header:"Released", width:80},
{ id:"votes", header:"Votes", width:100}
],
autoheight:true,
scroll:false,
data: [
{ id:1, title:"The Shawshank Redemption", year:1994, votes:678790, rating:9.2, rank:1},
{ id:2, title:"The Godfather", year:1972, votes:511495, rating:9.2, rank:2}
]
}
]
});

重要屬性

columns:Array,欄位設定用。
data:資料來源,來源格式可使用XML、JSON、CSV、JSArray、HTML Tables...etc。

重要方法

parse:帶入資料。
clearAll:清除資料。

備註:
匯出有小驚喜,免費版元件就有提供多種匯出格式(PDF、Excel、PNG和CSV)。


相關文章:

[Webix] 第一章:Introdution

[Webix] 第三章:Widgets

【.Net Core】 EF Core + Web API 實作

 EF Core是Entity Framework在.Net Core使用的版本,功能幾乎相同,但具有輕巧、高擴充性以及高效能等優點,建議各位學習。 通常在.Net Core如果要用ORM的方式會有兩種選擇分別是EF Core以及Dapper。 從其他網路文章可以看到這兩種在最新...