顯示具有 JavaScript 標籤的文章。 顯示所有文章
顯示具有 JavaScript 標籤的文章。 顯示所有文章

2015年8月14日 星期五

用filesaver.js 輕鬆將html table的資料匯出成Excel

過去有關Excel的匯出我都是用NPOI套件來撰寫,之前也有寫過類似的文章:

[鐵人30天]當ASP.NET MVC 遇見 Angular.js MVC 客戶管理系統(23) – NPOI匯出功能

但看到同事有使用filesaver.js這個套件來做匯出,個人覺得蠻方便的,就來分享一下

唯一有個限制,因為是用Html5的Blob來實現的,所以較舊的瀏覽器不支援

而有些版本只要再加載Blob.js也可正常運作

c85eee520a2e43589c3188a35b6ed0da

資訊來自 filesaver.js Github

官網已經有Demo示範匯出 png . txt . xhtml 的類型,以下就來實作實務上很常見的匯出table raw data

首頁Github整個clone下來會發現filesaver.min.js這個檔案,將這個檔案載入到你的網頁

e7a4119874a646ff9c98b135453ca671

接著我們寫個html假資料,並加個匯出按鈕,當然實際上你的資料來源可能是後端提供而來

ed9c7e3d3ce34582b205dcdc3784598e

22927ec38a9544ea871d38fcf1ce6978

接著我們用jQuery button click的時候,將tbData這個div底下的資料匯出

$(function () {
$('Button').click(function () {
var blob = new Blob([document.getElementById('tbData').innerHTML], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
});
var strFile = "Report.xls";
saveAs(blob, strFile);
return false;
});
});

這樣就可以很方便的匯出資料了!


780e1092f82642c59ffae31dead7beb5


Technorati 的標籤: ,,,

2014年10月6日 星期一

[鐵人30天]當ASP.NET MVC 遇見 Angular.js MVC 客戶管理系統(9)–WebAPI實作分頁

* 本篇目標

將WebAPI的資料在後端進行分頁

* Angular.ui.Bootstrap UI

Angular.ui.Bootstrap 能將一些Bootstrap JavaScrip 的功能,使用Angular.js Data Binding的方式來呈現,且CSS樣式還是以Bootstrap為主,是一個還不錯的UI搭配選擇。首先先透過Nuget安裝,並載入。

1298237de5114eb19c0309e6c4a120c2

* 開始擴充 BLL –> Web API –> View

分層的好處就是如果功能要擴充,對我來講會很直覺的一層一層去實作,而不會像所有程式碼都在一起,可維護性就比較差。

BLL層,我們增加兩個參數 : 目前頁數及顯示頁數,回傳總數量

b2222807b33747c7a0d3dce075b24c07

Web API ,向BLL要分頁的資料

e10594f486264e2eb0a1036a96ec0006

可以用瀏覽器來測試,傳入分頁參數

a945e2a229564c27b2ef6905fe86bf9b

View ( Angular.js)

記得之前有稍微提到Angular.js因都模組化,如需要某些功能,可以動態載入,故我們可以載入ui.bootstrap

489a18c3eb7b4f79aea18324c34a5f9b

Html 修改

Angular.UI.Bootstap可以很容易幫我們做到分頁功能,詳細的屬性可以至http://angular-ui.github.io/bootstrap/#/pagination查看,我們就直接看Code吧

a263a28c907b4d478a824bc37e0d5adf

結果畫面

9307a099aff2417cba3f70b8682326cb

* 後記

寫到這邊會發現一點問題,隨著功能越來越多,前端的Code也開始雜亂了,html與scripts的程式碼也開始混再一起,所以下一篇我們就來談談Angular.js的簡單分層方式,並將網頁改成用SPA系統(可不是泡溫泉的系統)。

 

本系列程式原始碼請至我的Github下載  https://github.com/kyleap

** 如內容有誤請告知,將進行修改,謝謝 **

2014年10月4日 星期六

[鐵人30天]當ASP.NET MVC 遇見 Angular.js MVC 客戶管理系統(7) - 取得WebAPI資料(Angular.js)

* 本篇目標

利用Angular.js像WebAPI取得資料

* 前言

以往開發前端多半倚賴jQuery,今年接觸到了Google所推出的JavaScript libery , 他是一個前端MVC的Freamwork,Study過後,認為將前端改寫成NG,程式會比較有彈性,故開始投入學習。個人認為學習曲線NG比學習jQuery還要高,本系列文章並不是針對NG做一個詳細介紹,故會採用"做中學"的方式,來實作ASP.NET MVC如何搭配Angular.js做開發。

* Visual Studio 安裝

我們一樣在Web專案使用Nuget安裝

4ae8c68e39ce4cca9b2fe982736d2a4f

會看到Scripts資料夾裡有非常的多的Angular套件,這是因為Angular.js模組化做得非常好,故如果沒有要用到的功能,就不用載入進來,而相關的模組有什麼功能可以用,其實可以google ng加檔名,就可以查到官方文件或文章,如 “ng-resource”。

e7f4127b09af48a0bdd1a59b23ba2450

接著我們打開MVC的 View,Shared資料夾_Layout.cshtml檔案,載入angular.min.js。

_Layout有點像是ASP.NET WebForm的Master Page,可以把一些共用的html,js,css放在這,頁面各自的View就不用存在於重複的程式碼 e.g 選單列。

4280682be0ba4eee9669dd2e0d31bb20

* 修改CustomerController

上一篇我們取得WebAPI資料的方式,是採取C# WebClinet的方式,在Contoller轉成ViewModel在給View,採用Angular.js將會做一些小修改。首先我們將程式碼註解起來。

219dc17ca88d4f54a3c278980a068d79

接著我們改寫View使用Angular.js的語法,會發現Visual Studio 2013 已經很貼心的將NG的語法變為紫色了,這讓開發更加的清楚,以下依步驟做介紹

ng-app : 可以說是Angular.js的起始點,子元素才會看得懂Angular.js的語法

ng-controller : 因為是MVC架構,故我們會在Scripts新增一個Controller的function,並指定這個Div使用CustCtrl

$scope : 可以想成是"前端"的ViewModel,又有點像是C#的Class,可以將變數定義在此,以此例,我們將後端取回的Customer JSON資料,丟給$scope裡的Customer。

$http : 在與後端資料溝通,我們可以使用$http來對Server API進行,POST . GET . PUT .DELETE,以此例我們向我們WebAPI取得資料,丟給$scope裡的Customer;失敗的話則給$scope一個變數error,並秀在Div裡。

$ng-repeat : 此語法可以讓我們很輕鬆的寫出迴圈功能,如Customer裡面的資料,我們將資料一筆一筆讀出來,並變成html table裡的tr列。

8c326a0bc5104c188986a7d4ab413b1e

結果畫面

07a6757c363749109aabd426f4892e7a

* 雙向繫結

在Angular.js的MVC架構,都有Data Binding的特性,也就是今天在Model改變了一些值,或在View改變了一些值,是兩方都會產生變化的。

image

用講的不太清楚,故我們來玩個小範例:

http://jsfiddle.net/kyleshen/5un6argf/

TestCtrl裡面Model有 Day . Name兩個變數,及一個事件 Add,將Day加1

ng-model : 可以指定這個input標籤 對應到Model的名稱

ng-click : 點選Click的時候去執行哪個事件

08cc1b432f954b36b1e13e27d00ef5fb

* 後記

此篇介紹了一些Angular.js的一些基本用法,下一篇預計來換個輕鬆主題,來介紹如何利用一些工具來快速美化我們的網站。

Angular.js逐步學習文章推薦:

男丁格爾Angular.js教學 http://abgne.tw/category/angularjs

黑暗執行緒Angular.js系列 http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/AngularJS/default.aspx

 

 

本系列程式原始碼請至我的Github下載  https://github.com/kyleap

** 如內容有誤請告知,將進行修改,謝謝 **

2014年2月16日 星期日

Visual Studio 2013–C#.JavaScript outline,一個摺疊程式碼(if else or for each)的小套件

這幾天發現一個小套件對Debug還蠻實用的,可以將程式碼摺疊起來,看程式邏輯時就會比較方便

安裝方式可透過Nuget

1111

Visual Studo 2010/2012也有支援,詳細效果與版本介紹可擴充功能頁面查看

http://visualstudiogallery.msdn.microsoft.com/6c3c5dec-1534-4c42-81b1-cfd4615fd0e9

至於Javascript則可下載 JavaScript outlining

1111

2014年1月28日 星期二

focus焦點於textbox在IE中失效之問題

這算是一個小記錄,起因是在Page Load的時候有的textbox要用JavaScript來做focus,但發現IE只要點選頁面其他元素時,在按F5(重新整理),則focus就會失效:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js "></script>
</head>
<body>
<input id="txtName" type="text" />
</body>
<script type="text/javascript">
$('#txtName').focus();
</script>
</html>


以上程式在Firefox和Chome都沒問題,但在IE Reflash就會失效,看起來好像IE載入元素、JavaScirpt的順序跟其他瀏覽器不太一樣(待確認),導致focus()事件在html document完成之前就先載入了,所以發現主控台會有以下錯誤


image


最後解決的方式是加個timeout,延遲執行focus

<script type="text/javascript">
setTimeout(function () {
$('#txtName').focus();
}, 500);
</script>

2014年1月25日 星期六

Html5 Storage使用心得與應用

前言

大概半年前,開始接觸到Html5相關技術,但其實沒有太深入在實務上使用過,因為html5常常需要新的瀏覽器支援,故舊版IE支援度就差,瀏覽器的支援度可以到html5 Test網站去測試,而如果用IE8執行,除了看到46分被當掉的分數外,也許你會好奇這46分是哪來的,那時就發現了Storage這個東西,並一直找機會想在實務上用看看,故此篇主要會將一些實務範例做分享。

image
(圖為IE8 html的考試卷)



Html5 Storage的基本介紹

我試著用最簡化的方式來介紹html Storage,當然你想更了解html的機制,可以再延伸去Google或者去參考下面的延伸閱讀。
以往我們要暫存資料可能會選擇Session或者是Cookie,而這兩者其實都跟伺服器端有關聯,Storage是一個純客戶端的新機制,他能儲存的資料大小比Cookie還要大(試瀏覽器而定,Cookie大約4KB,而html5 Storage能到5MB)
Storage又分為兩種:Session Storage和Local Storage,主要差別在生命週期的不同
  • Session Storage : 只要該頁面關閉,則Session Storage的生命週期即結束
  • Local Storage : 相反的,Local Storage在使用者清除瀏覽器資料生命週期才會消失

 

一些範例與應用

以下就介紹我的實務上的應用,也許不是使用的很恰當,或者是有更好的解法,但這篇的目的是讓大家在想Solutions時能想到有html5 Storage能應用。

紀錄div顯示隱藏的狀態

有時表單程式在使用者點選上一頁後,會因為瀏覽器的特性將某些欄位回到初始值狀態,例如下面的例子,我們在下拉式選單選擇其他,會顯示出一個textarea讓他輸入,這時我們就可以寫入Storage來儲存這個div目前應該是隱藏還是顯示。
http://jsfiddle.net/kyleshen/H2pse/
$('#ddlSkills').change(function(){
    if($(this).val() == 'Others') {
        sessionStorage.setItem('ShowOthers', "Y");
        $('#divOthers').show();
    }
    else {
        sessionStorage.setItem('ShowOthers', "N");
        $('#divOthers').hide();
    }
});

$(function(){ 
    //如果SessionStorage為Y時,秀出textarea
    if (sessionStorage.getItem("ShowOthers") == "Y") {
        $('#divOthers').show();
    }
});

會這樣做的原因是之前公司的複雜表單,會針對不同的條件狀態下,顯示不同的區塊及帶入不同的下拉選項或Radio選項,在Submit過後,會顯示出再一次確認表單資訊的訊息,如發現有錯則點選上一頁,這時要保存他所輸入的資訊不讓他重新輸入,那時候就用Session Storage來解決了 !

將Json資料儲存於Session Storage


現在前端技術越來越火紅,有時我們常常會使用一些前端的Gird框架來實作,如JQueryUI、EasyUI、KendoUI…等等,而這些框架多半都使用JSON來接收及傳遞資料。

假設如果Grid我們要獲取目前所勾選的Row資料,這些框架也能很輕鬆的獲取這些項目的JSON string,但如果要將這些項目傳遞到另一頁做處理呢 ? 你也許可以用QueryString將JSON字串當參數傳遞過去,但QueryString是有長度限制的,或者你可以將這些Row的PK,用QueryString傳遞,到該頁時再去DataBase撈取資料也是一個方法,但這樣又多一個Connection。故之前我是將這串JSON String存到Session Storage,即使在操作上換頁也可將這筆資料擷取出來繼續使用。

http://jsfiddle.net/kyleshen/72Qkm/
$(function(){ 
    //新增資料到陣列
    var Skills = new Array();
    Skills.push('C#');
    Skills.push('ASP.NET');
    Skills.push('JQuery');
    
    var Json = JSON.stringify(Skills);
    sessionStorage.setItem('JsonStr', Json);
    $('#DivJson').html(Json); //秀出Json字串的Div
    
});

後記


基本上有了這個儲存機制,可以解決的事情還蠻多的,這邊只是簡單舉例一些小小的應用方式,特別要注意的是,儲存的資料勢必要考慮是不是敏感性資料,畢竟是儲存於客戶端,其實用瀏覽器工具就能看到值並且做竄改,以Chome為例,就是案F12,使用開發者工具視窗,到Resources就能看到key跟Value,點兩下就能改變他的值。Storage已經被很多網站所使用,下次逛網站時,不如打開開發者工具看看那些大網站怎麼應用,並儲存那些資訊吧!

image

延伸閱讀

2013年11月29日 星期五

[ASP.NET]點選按鈕直接列印PDF內容

Notice : IE Only,如果是其他瀏覽器請點上一頁

前言

做IT的不外乎就是要面對公司內部千奇百怪的需求,有時使用者會得寸進尺,今天接到的需求是要在網頁上點按鈕,直接列印PDF內容,"跳出下載視窗打開文件列印太慢了" , "直接用瀏覽器開點列印還要選擇太麻煩了" !@#$@#%#…
--碎碎唸分格線--
以下就實做懶人列印PDF,點一下就可以去列表機等了:
aspx
<object id="Object1" name="obj_pdf" type="application/pdf" width="1" height="1">
     <param name='SRC' value='<%= FileName %>' />
</object>
<!-- 點按鈕觸發列印-->
<input type="button" value="Print PDF" onclick="document.obj_pdf.printAll()" />

aspx.cs
public static string FileName = "";
protected void Page_Load(object sender, EventArgs e)
{
     //檔案不能寫死,故針對實際情況給檔名、路徑
     FileName = "test.pdf";
}

點選後就會跳出提醒視窗,如果下次不想顯示可直接打勾

28fa7b3a-0429-4980-932d-f657fdcebb9f

--

Reference

http://forums.adobe.com/thread/976153

http://www.codeproject.com/Tips/689325/Send-PDF-files-directly-to-client-printer-without

2013年6月22日 星期六

[Javascript]knockout.js - 資料處理-清單呈現方式

在第一篇有提到如果你的Web應用主要再處理一些CRUD,那很適合用knockout.js來實現MVVM架構,後續介紹了屬性、事件的控制,這篇就要來介紹在knoctout.js對於資料的顯示及處理。

foreach

foreach可以綁定一組Array資料,只要很簡潔的程式碼,就能輕鬆的完成多筆顯示的功能,

首先,我們定義一個使用者的class,包含他的序號、姓名

image

再來到ViewMode去繫結這個User的陣列資料,而給值的方式跟以往不一樣,observableArray()主要用來繫結陣列,如果你這個陣列資料有任何變動,如新增、刪除,他會自動同步到UI的顯示。

image

接著我們新增假資料,讓頁面載入就有三筆資料

image

HTML部分才是強大的地方!只要用以下指定方式即可!

Table 呈現方式:

image

清單呈現方式:

image

接著我們加入新增和移除的功能,程式很單純,可往下看完整程式碼應該很好懂,要特別注意的是,如果我們要針對某列做處理,可以用$parent這個參數來取得父元素,如下圖,在某列點選移除,取得該列的TR,則可針對這筆TR做處理:

image

除了$parent外,還有以下方式:

$parents – 抓取所有外部的元素 ex :

$parents[0] - 此元素的父類別,以此例來說即為 TR (等同於$parent)

$parents[1] - 此元素的父類別的父類別(好饒舌),以此例來說即為 tbody …以此類推

$root - 抓取最外層的元素,以此例來說即為 body ,(等同於$parents[$parents.length-1])

以下附上新增&刪除的完整程式碼:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="Scripts/jquery-1.7.2.min.js"></script>
<script src="Scripts/knockout-2.1.0.debug.js"></script>
</head>
<body>
<button data-bind="click: AddUser">Add</button>
<button id="btn_json">Json</button>
<fieldset>
<legend>Table 呈現</legend>
<table>
<thead>
<tr>
<th>Number</th>
<th>First name</th>
<th>Last name</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: users">
<tr>
<td data-bind="text: Index"></td>
<td data-bind="text: firstName"></td>
<td data-bind="text: lastName"></td>
<td>
<button data-bind="click: $parent.RemoveUser">移除</button>
</td>
</tr>
</tbody>
</table>
</fieldset>
<fieldset>
<legend>清單呈現</legend>
<ul data-bind="foreach: users">
<li>
<span data-bind="text: Index">:</span>
<span data-bind="text: firstName"></span>
<span data-bind="text: lastName"></span>
<button data-bind="click: $parent.RemoveUser">移除</button>
</li>
</ul>
</fieldset>

<script type="text/javascript">

//定義使用者
var User = function (Index, firstName, lastName) {
var self = this;
self.Index = Index;
self.firstName = firstName;
self.lastName = lastName;
}

//ViewModel
var viewModel = function () {
var self = this;
self.users = ko.observableArray();
//新增使用者事件
self.AddUser = function () {
var index = self.users().length + 1;
model.users.push(new User(index, "Kyle", "Shen" + index));
}
//移除使用者事件
self.RemoveUser = function () {
self.users.remove(this);
}
}

//手動新增3筆假資料
var model = new viewModel();
for (var i = 1; i <= 3; i++) {
model.users.push(new User(i, "Kyle", "Shen" + i));
}
ko.applyBindings(model);

</script>
</body>
</html>


執行結果圖



image



--
Reference
http://knockoutjs.com/documentation/introduction.html
--



關聯文章



  • [Javascript]knockout.js-初體驗

  • [Javascript]knockout.js - 關於Html屬性的控制

  • [Javascript]knockout.js - 事件處理

  • [Javascript]knockout.js - 資料處理-清單呈現方式



  • 2013年6月21日 星期五

    [Javascript]knockout.js - 事件處理

    這篇要介紹一些寫Web常用的事件,在上面兩篇範例,我們已經有使用到click、checked…等等的事件,這篇主要將其他常用的事件做個介紹,並如何在knockout.js實現。

    mouseover、mouseout、disable、enable事件

    這是很常見的應用,控制滑鼠移入跟移出時做一些事情,此例情境:在移入表單時highlight這個區塊(更改背景顏色),如果他是女生,則讓她填寫電話,並且不讓她點離開(寫程式寫到瘋了…)

    image

    disable和enable我都指向ViewModel的LeavePhone這個自定義的Value,但true和false執行其實是相反的,就在自己習慣怎麼應用。

    focus事件

    focus是很常會用到的事件,我們在加入兩個需求:

    點選姓名時,則變成編輯狀態,而失去焦點時,則變更為Lable(單純顯示)的狀態。

    image

    如果電話欄位有焦點時,則跳出電話格式的提醒文字

    image

    Submit事件

    在送出表單之前,通常會有一些資料驗證,如果沒問題後才送回後端,在knockout.js,一樣只要在form標籤裡面bind一個function即可,當然妳也可以使用Click來觸發表單的Submit,但Submit通常多了一些行為,ex 點選Enter時送出表單,如果妳指定為click,還要針對輸入Enter事件做處理。

    完整程式碼:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="Scripts/knockout-2.1.0.debug.js"></script>
    </head>
    <body>
    <form data-bind="submit: CheckData">
    <div>
    <fieldset data-bind="event: { mouseover: Over, mouseout: Out }, style: { 'background': BackColor }">
    <legend>輸入表單
    <button type="submit" data-bind="disable: LeavePhone">離開</button></legend>
    <div>
    姓名:
    <lable data-bind="visible: !editing(), text: name, click: edit"></lable>
    <input data-bind="visible: editing, value: name, hasfocus: editing" />
    </div>
    <em>點選可修改姓名</em>
    <div>
    <input type="checkbox" data-bind="checked: LeavePhone" />我是女生<br />
    電話:
    <input type="text" data-bind="value: PhoneNumber, enable: LeavePhone, hasfocus: IsFocus" />
    <span data-bind="visible: IsFocus">請輸入格式09XX-XXXXXX</span>
    </div>
    <button type="submit">送出表單</button>
    </fieldset>
    </div>
    </form>
    <script type="text/javascript">
    var viewModel = function () {
    var self = this;
    self.BackColor = ko.observable(""); //區塊背景顏色
    self.LeavePhone = ko.observable(false);//是否需填寫電話
    self.PhoneNumber = ko.observable("");//電話
    self.IsFocus = ko.observable(false);
    self.name = ko.observable("路人甲");
    self.editing = ko.observable(false);
    this.edit = function () { this.editing(true) }
    //滑鼠移入事件,更改背景顏色
    self.Over = function () {
    self.BackColor("#eef3a8");
    },
    //滑鼠移初事件,無背景顏色
    self.Out = function () {
    self.BackColor("");
    }

    self.CheckData = function () {
    //驗證表單各欄位是否正確..在此省略
    return confirm("是否確定要送出表單?");
    }
    };
    ko.applyBindings(new viewModel());
    </script>
    </body>
    </html>
    --

    --
    Reference
    http://knockoutjs.com/documentation/introduction.html
    --



    關聯文章



  • [Javascript]knockout.js-初體驗

  • [Javascript]knockout.js - 關於Html屬性的控制

  • [Javascript]knockout.js - 事件處理

  • [Javascript]knockout.js - 資料處理-清單呈現方式

  • 2013年6月16日 星期日

    [Javascript]knockout.js - 關於Html屬性的控制

    在上一篇knockout.js初體驗有介紹用此框架來實作前端MVVM架構,延續這個主題,今天主要介紹控制常用Html屬性的幾個用法。

    Visible Binding

    在以往要控制Html標籤的顯示隱藏,我們可能需要在DOM的事件判斷將該標籤隱藏,如點選Checkbox,顯示某textarea。

    image_thumb2

    CSS Binding


    而CSS一樣可以加入一些邏輯判斷,套用不同的css,我們再將checkbox屬性打勾時(ShowTextarea),套用一個.highlight css class

    <h3 data-bind="css: { 'highlight': ShowTextarea }">Visible Binding</h3>


    Style Binding



    除了指定CSS外,也可使用Style來指定CSS屬性,方便的是可以做一些style的邏輯判斷,如我們判斷瀏覽器為Chome的話就加上底線的style



    特別要注意的是,在CSS屬性有"-"符號,如text-Decoration在knockout.js需寫成textDecoration



    Attr Binding



    有寫過JQuery的人一定對attr不陌生,在attr() function,我們通常用來設置Html標籤的屬性值,如$('#hrefID’).attr(‘href’,'http:www.google.com.tw’)就是將ID為hrefID的href屬性改變為Google網址,而在Knockout.js,我們一樣可以用Binding的方式來實現,之所以把Attr放在最後介紹,因為是一個很彈性的function,像Jquery一樣,你可在Attr指定Visible、Disabled、Style等屬性。


     


    完整程式碼


    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="Scripts/jquery-1.7.2.min.js"></script>
    <script src="Scripts/knockout-2.1.0.debug.js"></script>
    <script type="text/javascript">
    //判斷是否為Chome瀏覽器
    var IsChome = function () {
    if (navigator.userAgent.indexOf('Chrome') != -1) {
    return true;
    }
    return false;
    };

    var viewModel = function () {
    //定義ShowTextarea,預設值為隱藏textarea
    var self = this;
    self.ShowTextarea = ko.observable(false);
    self.AreaData = ko.observable("");
    //定義<a></a>相關的ViewModel
    self.HrefLink = ko.observable("http://www.google.com.tw");
    self.HrefTitle = ko.observable("Google Now");
    self.HrefText = ko.observable("Go to the Google");
    self.HrefType = ko.observable("_blank");

    //ViewModel增加確認瀏覽器
    self.CheckBroser = ko.computed(function () {
    return IsChome() ? 'underline' : '';
    });
    };

    $(function () {
    ko.applyBindings(new viewModel());
    });
    </script>
    <style type="text/css">
    .highlight {
    color: blue;
    }
    </style>
    </head>
    <body>
    <h3 data-bind="css: { 'highlight': ShowTextarea }" >Visible Binding</h3>
    <!-- checked值改變時,去變更ViewModel的ShowTextarea true or false-->
    <input type="checkbox" data-bind="checked: ShowTextarea" />顯示textarea
    <br />
    <!-- 繫結ViewModel的ShowTextarea來控制顯示或隱藏-->
    <textarea rows="4" cols="50" data-bind="visible: ShowTextarea">
    </textarea>
    <h3 data-bind="style: { 'textDecoration': CheckBroser }" >Attr Binding</h3>
    <!-- 繫結此<a></a>對應ViewModel的欄位,設置title屬性即時獲得變化 -->
    Set Title :
    <input type="text" data-bind="value: HrefTitle" /><br />
    <a data-bind="text: HrefText, attr: { 'title': HrefTitle, 'href': HrefLink, 'target': HrefType }"></a>

    </body>
    </html>


    --
    Reference
    http://knockoutjs.com/documentation/introduction.html
    --


    關聯文章


  • [Javascript]knockout.js-初體驗
  • [Javascript]knockout.js - 關於Html屬性的控制
  • [Javascript]knockout.js - 事件處理
  • [Javascript]knockout.js - 資料處理-1
  • 2013年6月9日 星期日

    [Javascript]knockout.js-初體驗

    前言

    活在這代的程式設計師很幸福,網路資源非常多,且不管Server-Side或者是Client-Side的程式語言,已經越來越多的函式庫能使用,只要簡單的語法就能實現複雜功能,前一陣子開始尋找JavaScript的框架,無意間看到黑暗執行緒前輩撰寫的knockout.js系列文,就決定開始利用時間好好的Study這個Javascript框架,但光看是沒有用的,就好像女生不跟著鄭多燕老師動一動的話永遠也瘦不下來!廢話不多說,這篇主要做個簡單介紹。

    MVVM

    如果你Web應用主要在處理一些資料的CRUD,knockout.js是你可考慮的前端框架,他主要在頁面上實現MVVM(Model-View-ViewModel)開發架構,將資料及事件定義成一個ViewModel,用來做雙向的綁定(Two-Way Binding),以實例加下圖來解釋:

    如使用者在某個text欄位輸入資料或者點選某個Button,會造成資料的變動,在以往我們可能需要在這些事件(onChange、onKeyup)來控制顯示的資料,而knockout.js幫我們簡化了這些工作,將這些Event及及Data定義在一個ViewModel的Class,當有變動或觸發時,由於View和ViewModel的資料是雙向綁定的,所以使用者輸入的資料能被ViewModel捉捕,而ViewModel的資料更新也能自動反應在View上,這樣的好處是我們可以專注在資料的操作,無需去管HTML的細節。

    所以我想這就是命名為 Knock(敲) - Out的原因吧XD

    圖片來源

    knockout.js的特性

    1.當資料模組異動時,自動反應到UI該更新的部分

    2.連結欄位的方式語法非常簡單,有點像是ASP.NET的GridView+DataSource

    3.高彈性的樣本可套用,建構複雜UI非常方便

    4.一樣可使用JQuery(本人對JQuery控制DOM還有愛,能不衝突真是太棒了)

    5.微軟主推!故在MVC的SPA(Single Page Application)專案可看到就是以knockout.js來實作

    6.支援各瀏覽器

    如何開始

    就小弟學習方式,除了看黑暗大的系列文外,可去官網Step by step的教學,另還有提供Sample Code,故大大的減少了學習曲線,另外這邊有個Google論壇,會有人很多人在上面討論(但都是英文就是了),也可去Youtube下關鍵字,會看到很多教學影片。

    開始動一動

    需求情境

    這篇要寫的功能非常無聊,輸入員工的姓氏及名字,然後用一個<h1>標籤即時顯示已姓加名的公司Email,點選Button能Alert此Mail,希望能Step by step來簡單說明。

    定義一個ViewModel

    在開始動手前,先別管HTML的UI吧,先定義出此頁面所需的資料,定義出這個ViewModel,在此功能,我們在Model有FirstName及LastName及Email三個資料欄位,而預設值給空白字串。observable()是knockout.js給Value的語法,切記不要寫成Self.firstName = “”,而computed()語法可將其他欄位進行運算,以此案例,我們希望將姓氏和名字組成Email然後回傳。

    <script>
    //先定義一個員工的ViewModel
    var StaffModel = function () {
    var Self = this;
    Self.firstName = ko.observable("");
    Self.lastName = ko.observable("");

    Self.Email = ko.computed(function () {
    if (Self.firstName() == "" || Self.lastName() == "") return "";
    return Self.firstName() + "." + Self.lastName() + "@gmail.com";
    }, Self);

    };
    </script>


    而HTML的部分只要簡單的Data-bind語法,輸入對應的欄位名稱即可完成雙向綁定,而text和Value就等於HTML的標籤屬性。

    <input type="text" id="txt_fname" data-bind="value: firstName" placeholder="ex:Kyle" />
    <input type="text" id="txt_lname" data-bind="value: lastName" placeholder="ex:Shen" />
    <h1 data-bind="text: Email"></h1>
    增加Click 事件

    接著我們在ViewModel再來定義Click事件,點選之後秀出Email

    //Click事件
    Self.AlertEmailValue = function () {
    if (Self.firstName() == "" || Self.lastName() == "") {
    alert('請輸入完整資訊!');
    return;
    }
    var Email = Self.firstName() + "." + Self.lastName() + "@gmail.com";
    alert('Hello,Your Email is ' + Email);
    };
    而Event的Binding方式也很簡單:
    <button data-bind="click: AlertEmailValue">秀出Email</button>
    完成綁定最後,只要利用applyBindings()語法,即可將這個頁面完成雙向綁定,此段須放在JQuery的$.ready裡面,確保元素都載入完成
    $(function () {
    ko.applyBindings(new StaffModel());
    });


    完成效果



    是不是很Cool呢!!再以往我們可能要用Script去控制DOM完成效果,現在套用knockout.js已經省了很多事~1

    後記

    其實小弟學習knockout.js最主要希望能搭配MVC的SPA網頁來進行開發,所以決定循序漸進的一步一步學習,順便在這學習過程中,記錄下來,能幫助到一些人,如果內容敘述有錯,請麻煩告知小弟,會盡快做處理 ^_^



    範例檔下載



    --



    Reference



    http://sushiwens.blogspot.tw/2012/07/backbonejs-angularjs-emberjs-knockoutjs.html



    http://blog.miniasp.com/post/2013/04/24/Front-end-Engineering-Fineart-An-Introduction-to-AngularJS.aspx



    http://blog.darkthread.net/post-2012-05-09-knockout-js-intro.aspx



    http://learn.knockoutjs.com/#/?tutorial=collections


    關聯文章


  • [Javascript]knockout.js-初體驗
  • [Javascript]knockout.js - 關於Html屬性的控制
  • [Javascript]knockout.js - 事件處理
  • [Javascript]knockout.js - 資料處理-1
  • 2013年1月15日 星期二

    [Jquery]使用Cycle Plugin輕鬆做出輪播功能

    Jquery 是一個Javascript的函示庫,基本上不用太多介紹,它變成Web Dveloper必備的技能之一
    套件多到每天逛也逛不完,今天要介紹最近工作有使用到的輪播/跑馬燈套件
    目前網頁設計多半不會塞滿了文字,所以圖片輪播在網頁上還蠻常見的,
    使用Jquery Cycle 套件只要幾行程式碼就可以完成此功能
    官網已經有很多Demo的範例,這邊把一些比較會用到的功能做個紀錄: 
    製作最陽春的輪播
    Step 1 加入圖片檔,並塞至一個div標籤裡,內容可以換成Span or input 標籤當成文字跑馬燈
    <div id="slideshow">
        <img src="img1.png" />
        <img src="img2.png" />
        <img src="img3.png" />
    </div>
    

    Step 2 調整CSS
    <style type="text/css">
    #slideshow 
    {  
        top: 0px; 
        left: 0px;  
        float: left;  
        width: 200px;  
        height: 10px;
        z-index: -5; 
    } 
    </style>

    Step 3 加入Script
    <!-- <script src="../jquery.cycle.lite.js" type="text/javascript"></script>-->
    <script src="../jquery.cycle.all.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () { 
             $('#slideshow').cycle({  
                 fx: "scrollHorz"  
             }); 
        });
    </script>

    是的,就是那麼容易,輪播功能已經完成了,
    fx參數是切換的效果,如果不用太多炫麗的效果,
    只要載入lite檔就夠了畢竟cycle.all.js檔會比較肥大,
    切換效果參數的設定可以至此頁面參考,
    加入分頁切換功能
    圖片輪播完成了,但圖片很多總不能叫使用者傻傻等吧!
    也是只要加入個div,設定幾個餐數就可以完成!
    <div id="slideshow">
        <div id="nav1"></div>
        <img src="img1.png" />
        <img src="img2.png" />
        <img src="img3.png" />
    </div>
    $(document).ready(function () { 
        $('#slideshow').cycle({ 
             fx: "scrollHorz", 
             speed: 'fast', 
               timeout: 3000,  
               pager: '#nav', 
               slideexpr: 'img'
          }); 
    });

    如果要搭配Ajax去抓資料
    如要使用Ajax,去做局部更新的效果
    此套件也有很多事件可以控制:
    $(document).ready(function () { 
        $('#slideshow').cycle({ 
             fx: "scrollHorz", 
             speed: 'fast', 
               timeout: 3000,  
               pager: '#nav', 
               slideexpr: 'img', 
            before: function (currslideelement, nextslideelement, options, forwardflag) {
                  //抓到目前圖片的index  
                  $('#txt_index').val($(nextslideelement).index());
                // do something .....  
            }  
          }); 
    });

    以上,還有很多功能可以去官網玩看看!!