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

2013年7月25日 星期四

ng-options的一點小注意事項!

前天我寫了一個 Angularjs 的 select 連動功能,發現一些使用上會忽略的事情特在此紀錄一下!

有寫過 Angularjs 的人就會知道 select 跟 ng-options是多麼的好用!

其中只要 ng-model榜定一下,我們選了什麼立刻就反應回去我們的model!

也因此我們可以透過 $watch() 監看我們綁定的值或是用ng-change這兩種方式來觸發選取後的動作!

這兩種方是我都試過但我個人偏好使用 ng-change ( 主觀的只是一種 fu.....XD

但我遇到的一個問題是用 ng-options 的時候 select 會有空白選項.....

難道我遇到了傳說中的「留白」.....

在藝術或設計手法中適當的留白可以營造一種氣氛! 襯托出一種心境上的氛圍!

但在程式上這就叫做「BUG」...... ( 怎差這麼的多.....

後來我發現會有這問題其實是因為我們 ng-model 一開始的初始值是空的啦!

只要給一下初始值就不會「留白」囉!

例如:
<select ng-model="township.ZipCode" ng-options="township.ZipCode as township.Name for township in areas" ng-change="townshipChange()"></select> 

如果一開始我們的 scope.areas 是[],就會有這問題!

解決方是就是不要讓它是空的就行囉!

2013年7月22日 星期一

Angularjs 搭配 SVG!

上個禮拜我在關心一個問題! 那就是用 Angularjs 怎樣畫圖比較方便!



現在再web上畫圖不外乎幾種常用方法:

1.用SVG (向量繪圖)
2.用CSS (就像我上一篇那樣畫法)
3.用Canvas (html5的新標籤)

有些人可能會覺得為什麼要在web上畫圖而不直接用圖片就好呢?

我自己是覺得啦! 因為用圖片做一些動畫沒有上面方法方便,如果有很多變化就要很多圖片一直切換很麻煩....又很占空間效能!

另外如果想要圖片上某些位置觸發某些事件這樣的功能!

我就還要切圖片切出一個個的範圍然後針對圖片的某個範圍寫事件...這也很麻煩!

像我之前寫過一個計算機!

用一個計算機的圖片在 photoshop 中切出一堆範圍,然後在這些範圍寫 javascript 事件!

比如要算 10+25 

1是一個範圍
0是一個範圍
+是一個範圍
2是一個範圍
5是一個範圍

雖然功能也是能完成啦! 但這樣多累阿!  寫起來程式碼又很亂!

所以某些時候真的還是要用上述那三種方式畫圖會比用圖片還方便!!

也因為這原因,我就在思考這三種方式怎樣跟 Angularjs 最好搭配!!

Canvas方法因為是直接在 Canvas 標籤裡面呼叫繪圖API來畫圖,所以我感覺跟 Angularjs 搭配怪怪的! 因為沒地方可以用那些 預設的 directive 啊!  

CSS方法則是畫圖的數據資料都放在 <style></style> 裡面,但 Angularjs 又不能控制外部樣式的內容! 行內樣式硬要控制好像可以控制啦! 但應該沒人用CSS行內樣式畫圖的吧!  (那會瘋掉...

而SVG這東西其實我完全沒碰過,所以我去找了一下資料,學了一下要怎用! 後來我找到一篇文章還不錯! 

如何在 SVG 與 Canvas 之間選擇

雖然現在用Canvas來畫圖是個顯學! 

但文中也比較了一些優缺點! 用Canvas來畫圖還是有缺點的唷!

好! 回到重點!

在我研究完SVG如何使用之後!

我自己覺得 SVG 跟 Angularjs 應該可以搭配得很好!

因為SVG是用很像標籤的東西在畫圖,格式就像下面所示:

<div>
    <svg>
        <polygon></polygon>
        <polygon></polygon>
        <polygon></polygon>
    </svg>
</div>

座標、顏色等的屬性我都省略了! 但看整個結構可以發現! 它就跟我們一般的網頁標籤一樣! 所以比如我們要在某個多邊形加一個按下事件就可以這樣寫:

<div ng-controller="myController">
    <svg>
        <polygon ng-click="select()"></polygon>
        <polygon></polygon>
        <polygon></polygon>
    </svg>
</div>

所以我個人覺得啦! Angularjs 跟 SVG 搭配還挺不錯的! ( XD....

剛好今天LION大大交代我改CMS這案子的一個東西!

就是要加色碼選擇器!

我後來用SVG做了一個127色的色碼選擇器如下所示:


使用者只要 mousemove 進一個多邊形就會回傳一組16進位的色碼進去程式中!

我本來想要寫成 directive 但後來太客戶在催太趕了!

我來不及寫成 directive 所以就先寫成一般的方式!

等我有空的時候再來把它改寫成 directive! 這樣就可以多個地方重複使用囉!! ^ . ^

2013年7月17日 星期三

神奇的directive!

今天我的工作心得有點像大雜燴XD

因為有參雜一些之前犯的錯誤以及今天的新發現,所以跟前兩天的文章不一樣,比較不是聚焦某一點的內容,但我會盡量整合的好像是在講同一件事啦.....


photo credit: markchadwickart via photopin cc

在Angularjs的世界裡面,有一個東西叫「directive」!

這東西我第一次看到的時候是被它那自訂標籤的功能所深深吸引! (真是太神奇了...

能夠自訂標籤就代表我能當神耶!....

雖然它不只可以當標籤,也可以當屬性、類別或comment(這個我不知道中文叫什麼...)

所以我之前就習慣把所有的東西全部打成一包,然後就當成標籤了! 比如下面這例子:

.directive('back',function(){
        return{
            restrict:'E',
            template:'<a class="btn btn-primary btn-small">按鈕</a>',
            link:function(scope,element){
                element.bind('click',function(){
            alert("test"); 
                })
            }
        }
    })

html 如下:

<back></back>

這乍看之下好像很乾淨是吧!

但保哥針對這作法提出了幾點隱憂,我覺得滿有道理的,整理如下:

1.外觀寫在template裡面,要動任何外觀都要再改template,並不彈性
2.外觀和行為全部混為一談,並不好維護
3.在一個標籤上雖然可以自訂一堆directives但根本沒意義,還不如用簡單的attribute來做

第三點白話意思就是「搞那麼複雜幹嘛啦! 有更簡單的做法幹嘛不用! 」

那更簡單的方法是什麼呢?

我從保哥給我的了一個jquery的例子中找到靈感:

$('.btnBack').on('click', function(e){
        e.preventDefault();
        var uri = $(this).data('url');
        if(url)
        {
              alert('This url is ' + url);
        }  
});

html如下:
 <a href="#" class="btnBack" data-url="#/Account">回上頁 (代入 data-url 屬性)</a>

有看到一個陌生的東西嗎? data-url ?

後來我才知道,原來html5可以自訂屬性耶! 用法格式就是 data-*

如此看來,用directive寫一堆自訂的directive 屬性好像真的有點多此一舉耶!

只要我能夠抓到我所自訂的 data-* 屬性值,我又何必用一堆directive attribute,然後又在directive的scope中寫一堆"@","=","$"呢?

是不是!  是不是!

這真的有如醍醐灌頂耶!

但問題是 jquery 可以用 data() 或 attr() 來抓屬性值! 但 Angularjs 呢?

哈哈! 這東西今天被我找到了!

救世主降臨!


photo credit: Waiting For The Word via photopin cc

 $observe 就是救世主!

舉個例子,有個html 長的如下:

<a class="btn btn-primary btn-small back " href="a.htm">回上一頁</a>

那我要怎樣直接抓href這屬性的值呢? 做法如下:

app.directive('back',function(){
        return{
            restrict:'C',
            link:function(scope,element,attr){
                attr.$observe('href', function(actual_value) {
                    alert(actual_value);
                });
           }
        };
    });

看到那段紅色的程式碼了嗎?

那就是答案!

所以囉! 如果我們有其他額外的參數要作為行為的判斷依據,就自己加 data-* 然後再來抓這值就好囉!

這樣是不是比寫一堆directive attribute清楚多了呢!   ( 好像是....XD

另外提醒一點啦! 如果自訂屬性是 data-count

那麼要抓它的值的語法是 attr.$observe('count', function(actual_value) 這樣唷!!

不要打成 'data-count' 囉!!

說個補充,有一次我在寫 directive 的時候發生了很奇怪的事情!

好恐怖! 超級恐怖!


photo credit: Bob Jagendorf via photopin cc


那就是兩個一模一樣內容但名稱不一樣的directive,一個總是好的但另一個總是沒效果!

這兩個directive的名稱分別是 myPicture 和 pic

叫myPicture這個directive就是沒有反應! 怪事勒!

後來我請教了我們的LION大大,試了一會兒!

後來我們得到一個結論!

結論就是「名稱只能小寫」.....

只要有大寫或符號(包括底線)那麼這個directive就會沒有作用....

原來可以大寫! 我一直搞錯「-」這符號原來是要寫在標籤裡不是寫在名稱.....( 我是阿呆

但directive的名稱有任何符號還是會失效唷!! 

切!.....  害我改了好久想說是哪裡中猴了哩.....Orz


2013年7月15日 星期一

ng-repeat是多胞胎產生器!

在 Angularjs的世界裡,我覺得ng-repeat這玩意兒應該可以算是前5名常用的功能吧!

 photo credit: Spigoo via photopin cc
沒錯! 就像上圖一樣! 只要有了ng-repeat一次生出多胞胎再也不用大粒汗小粒汗!

所有重複性的table資料、重複性的list資料、重複性的div資料....(我現在不斷重複也是...= =

都可以透過ng-repeat來迅速完成!!

但是, 我們都知道雙胞胎不管長的多像, 還是有些微的不同!

這可能是老天爺為了要給辛苦的媽媽好分辨用吧! 就感心耶!!

所以啦! 當你的孩兒們(model裡的資料)都長的一模一樣的時候,

oh my god~ 神的審判之槌就會降臨,F12按下去,Error之槌就會共尬力咪咪冒冒...$#&$@!

比如說,我的model data 長的如下:

$scope.model.chlidren=["大寶","大寶","大寶","大寶"];

html長的如下:

<ul>
    <li ng-repeat="model.children">
</ul>

這時候F12審判之神會告訴你:

My dear , Duplicates in a repeater are not allowed.
(翻譯: 親帶的,你的多胞胎因長得一模一樣有基因改造之疑慮所以予以駁回!)

蝦密! 我黃豆吃太多了嗎? 政府沒有把關! 現在到底還有什麼可以吃...

沒關係! 在Angularjs 的世界裡,好險我們不用肝臟來代謝毒素,也不用害怕毒素會殘留在體內!

只要把<li ng-repeat="model.children">這句改成,<li ng-repeat="model.children track by $index">即可!

我是這理解的,孩子長得一模一樣沒關係,給他們各自不一樣的「胎記」就好,而這胎記就是$index啦!

神奇唄!

PS: Angularjs世界是可以這樣啦! 但現實世界怎麼辦?  現在還有什麼可以吃的啦 >< 喔我的天..


開張文!!

阿福兔E之家開張囉!

其實這是我第一次寫Blog! 

雖然之前一直也都寫的計畫!  ( 計畫總是那麼美好....

但總是沒個目標不知道要寫什麼....暈~

剛好的是! 今年7月我正式成為多奇家族的一員了!!

開始作著我之前就一直十分想做的網頁前端工作 ^.^ YA比!

然後保哥也十分鼓勵我們寫些技術文章!!

一方面是能作為和他人交流的一種方式!!  

另一方面是幫助自己記憶 (唉唷!! 人越大記性越不好咩!~

所以就稱著這次機會終於開始我的部落格生涯囉!!

我會記錄著前端工作的點點滴滴! 

每天記錄一點! 總有一天會變一大點是吧! XD

給自己一個期許! 我要成功! 我要成功! 加油! 加油! 加油!