1. 程式人生 > >Ember.js 入門指南——工具類的助手

Ember.js 入門指南——工具類的助手

    本篇主要介紹格式轉換、自定義helper、自定義helper引數、狀態helperHTML標籤轉義這幾個方面的東西。

按照文章慣例先準備好測試所需要的資料、檔案。仍然是使用Ember CLI命令,這次我們建立的是helpercontrollerroute(建立route會自動建立template)。

    ember generate helper my-helper

    ember generate controller tools-helper

    ember generate route tools-helper

1自定義helper

       自定義助手非常簡答直接使用

Ember CLI命令生成就可以了。當然你也可以手動建立,自定義的助手都是放在app/helpers目錄下。Ember會根據模板上使用的助手自動到這個目錄查詢。定義了helper之後你就可以直接在模板上使用。

<!--  //app/templates/tools-helper.hbs  -->
 
my-helper: {{my-helper}}

   程式沒有報錯,但是什麼也沒有顯示。是的什麼也沒有顯示。沒有顯示就對了。因為我們對於剛剛建立的app/helpers/my-helper.js沒有做任何的修改。你可以看這個檔案的程式碼。直接返回了params,目前來說這個引數是空的。修改這個檔案,直接返回一個字串。

//  app/helpers/my-helper.js
 
import Ember from 'ember';
 
export function myHelper(params/*, hash*/) {
  return "hello world!";
}
 
export default Ember.Helper.helper(myHelper);

此時可以在頁面上看到直接列印了“hello world!”這個字串。這就是一個最簡單的自定義helper,不過這麼簡單helper顯然是沒啥用的。Ember的作者肯定不會這麼傻的,接著下面介紹helper的引數。

注意:使用模板的名字跟檔名是一致的。不同

單詞使用“-”分隔,個命名規則不是制性的但是Ember建麼做,Ember會自根據helper的名字找到對應的自定的helper,然後行helper里名字為myHelper(名字是檔名的駝峰式命名)的方法,在這個方法裡你可以實現你需要的邏輯些工作Ember自幫你做了,不需要你寫解析的代

1helper無名引數

       上面的程式碼定義了一個最簡單的helper,不過沒啥用,Ember允許在自定義的helper上新增自定義的引數。

<!--  //app/templates/tools-helper.hbs  -->
my-helper-param: {{my-helper 'chen'   'ubuntuvim'}}

在這個自定義的helper中增加了兩個引數,既然有了引數那麼又有什麼用呢?當然是有用的,你可以在自定義的helper中獲取引數,獲取模板的引數有兩種方式。

寫法一

//  app/helpers/my-helper.js
 
import Ember from 'ember';
 
export function myHelper(params/*, hash*/) {
       // 獲取模板上的引數
     var p1 = params[0];
     var p2 = params[1];
     console.log('p1 = ' + p1 + ", p2 = " + p2);
 
       return p1 + " " + p2;
}
 
export default Ember.Helper.helper(myHelper);

寫法二

//  app/helpers/my-helper.js
 
import Ember from 'ember';
 
export function myHelper([arg1, arg2]) {
       console.log('p1 = ' + arg1 + ", p2 = " + arg2);
       return arg1 + " " + arg2;
}
 
export default Ember.Helper.helper(myHelper);

引數很多的情況使用第一種方式用迴圈獲取引數比較方便,引數少情況第二種方式更加簡便,直接使用!

注意:引數的順序與模板傳入的順序一致。

頁面重新整理之後可以在頁面或者瀏覽器控制檯看到在helper上設定的引數值了吧!!如果你的程式沒有錯誤在瀏覽器上你也會得到下圖的結果:

第一行因為在模板上沒有傳入引數所以是undefined,第二行傳入了引數,並且直接從helper返回顯示。

2helper命名引數

       上一點helper無名引數演示了在模板中傳遞無名的引數,這一小節講為你介紹有名字的引數。

<!--  //app/templates/tools-helper.hbs  -->
my-helper-named-param: {{my-helper   firstName='chen' lastName='ubuntuvim'}}

    相比於第一種使用方式給每個引數增加了引數名。那麼helper處理類有要怎麼去獲取這些引數呢?

//  app/helpers/my-helper.js
 
import Ember from 'ember';
 
// 對於命名引數使用namedArgs獲取
export function myHelper(params, namedArgs) {
       console.log('namedArgs = ' + namedArgs);
       console.log('params = ' + params);
       console.log('=========================');
       return namedArgs.firstName + ", " + namedArgs.lastName;
}
 
export default Ember.Helper.helper(myHelper);

    獲取命名引數使用namedArgs,其實你也可以按照前面的方法使用param獲取引數值。你在第一行列印語句上打上斷點,是瀏覽器進入debug模式,但不執行,你會發現params一開始是有值namedArgs沒有值,但是執行到最後正好相反,params的值被置空了,namedArgs卻有了模板設定的值,你可以猜想下,Ember可能是把params的值賦值到namedArgs上了,不同之處是namedArgs是以物件屬性的方式取值並且不用關心引數的順序問題,params是以陣列的方式取值需要關心引數的順序。

2,時間格式化

做開發的都應該遇到過數字或者時間格式問題,特別是時間格式問題應該是最普遍遇到的。不同的專案時間格式往往不同,有“yyyy-DD-mm”型別的有“yyyyMMdd”型別以及其他型別。

       同樣的Ember模板也給我們提供了類似的解決辦法,那就是自定義格式化方法。通過自定義helper實現資料的格式化。

       1,建立格式化helperember generate helper format-date

       2,在controller初始化一個時間資料。

//  app/controllers/tools-helper.js
 
import Ember from 'ember';
 
export default Ember.Controller.extend({
       currentDate: new Date()
});

預設情況下顯示資料currentDate

<!--    //app/templates/tools-helper.hbs    -->
​{{ currentDate}}    

    ​此時顯示的預設的資料格式。執行http://localhost:4200/tools-helper,可以在頁面看到:Mon Sep 21 2015 23:46:03 GMT+0800 (CST) 種格式的時間顯然不太合法我們的習慣,看著都覺得不舒服。那下面使用自定義的helper格式化日期格式。

//  app/helpers/format-data.js
 
import Ember from 'ember';
 
/**
 * 注意:方法名字是檔名去掉中劃線變大寫,駝峰式寫法
 * 或者你也可以直接作為helper的內部函式
 * @param  {[type]} params 從助手{{format-data}}傳遞過來的引數
 */
export function formatDate(params/*, hash*/) {
       console.log('params = ' + params);
    var d = Date.parse(params);
    var dd = new Date(parseInt(d)).toLocaleString().replace(/:\d{1,2}$/,' ');  //  2015/9/21 下午11:21
    var v = dd.replace("/", "-").replace("/", "-").substr(0, 9);
    return v;
}
 
export default Ember.Helper.helper(formatDate);

   或者你也可以這樣

export default Ember.Helper.helper(function formatDate(params/*, hash*/) {
    var d = Date.parse(params);
    var dd = new Date(parseInt(d)).toLocaleString().replace(/:\d{1,2}$/,' ');  //  2015/9/21 下午11:21
    var v = dd.replace("/", "-").replace("/", "-").substr(0, 9);
    return v;
});

便,直接就替字元,修改時間分隔字 “/”“-”

然後修改示的模板,使用自定的helper。

<!--    //app/templates/tools-helper.hbs    -->
​{{format-date currentDate}}    

時頁面上示的時間是我熟悉的時間格式:

上面介紹的是簡答的用法,Ember還允許你傳入時間的格式(format),以及本地化型別(locale)。

       1,用命令新建一個helperember generate helper format-date-time

       2,在controller類裡新增兩個用於測試的屬性cDatecurrentTime

//  app/controllers/tools-helper.js
 
import Ember from 'ember';
 
export default Ember.Controller.extend({
       currentDate: new Date(),
       cDate: '2015-09-22',
       currentTime: '00:22:32'
});
<!--  //app/templates/tools-helper.hbs  -->
 
<br><br><br>
format-date-time: {{format-date-time currentDate cDate currentTime format="yyyy-MM-dd h:mm:ss"}}
 
 
<br><br><br>
format-date-time-local: {{format-date-time currentDate cDate currentTime format="yyyy-MM-dd h:mm:ss" locale="en"}}

    ​在助手format-date-time上一共有4個屬性。cDatecurrentTime是從上下文獲取值的變數,formatlocaleEmber專門提供用於時間格式化的屬性。

       下面看看format-date-time這個助手怎麼獲取頁面的資料。

// app/helpers/format-date-time.js
 
import Ember from 'ember';
 
export function formatDateTime(params, hash) {
       //  引數的順序跟模板{{format-date-time currentDate cDate currentTime}}上使用順序一致,
       //  cDate比currentTime先,所以第一個引數是cDate
       console.log('params[0] = ' + params[0]);  //第一個引數是cDate,
       console.log('params[1] = ' + params[1]);  //  第二個是currentTime
       console.log('hash.format = ' + hash.format);
       console.log('hash.locale = ' + hash.locale);
       console.log('------------------------------------');
 
     return params;
}
 
export default Ember.Helper.helper(formatDateTime);

    ​我只是演示怎麼獲取頁面format-date-time助手設定的值,得到頁面設定的值你想幹嘛就幹嘛……

  最後看看瀏覽器控制檯的輸出資訊。

因為頁面使用了兩次這個助手,所以自然也就列印了兩次。

3,轉義HTML標籤

       官方的解釋是:為了保護你的應用免受跨點指令碼攻擊(XSS),Ember會自動把helper返回值中的HTML標籤轉義。

       新建一個helperember generate helper escape-helper

// app/helpers/escape-helper.js
 
import Ember from 'ember';
 
export function escapeHelper(params/*, hash*/) {
  // return Ember.String.htmlSafe(`<b>${params}</b>`);
  return `<b>${params}</b>`;
}
 
export default Ember.Helper.helper(escapeHelper);
<!--  //app/templates/tools-helper.hbs  -->
​escape-helper: {{escape-helper   "helloworld!"}}    

此時頁面上會直接顯示<b>helloworld!</b>而不是helloworld被加粗了!如果你確定你返回的字串是安全的你可用使用htmlSafe方法,這個方法不會把HTML程式碼轉義,HTML程式碼仍然能起作用,那麼頁面顯示的將是加粗的helloworld

到此模板這一章全部講完了!!!但願你能從中得到一點收穫!!後面的文章將開始講routeroutelink-to助手這一篇已經講過一點,但不是很詳細。接下來的一章將會為你詳細解釋route