【翻譯】在Ext JS整合第三方庫
作者:Kevin Kazmierczak
Kevin Kazmierczak is a Senior Technical Architect at Universal Mind, an innovative digital solutions agency that fuses the design capabilities of an interactive firm with the the technical expertise of a systems integrator. He specializes in building frontend applications using Objective-C, HTML/JS, and Flex. Kevin holds an MBA and a BA in Computer Science from Alfred University.
介紹
Ext JS提供了大量可高度自定義的直接就可以使用的內部元件。如果元件不在框架中,也可以容易的通過擴充套件類的方式,甚至通過瀏覽Sencha市場來獲取所需要的元件。這工作可能需要花費大量的時間,有時候為了節省時間,會考慮使用沒有包含在Ext JS元件系統的第三方庫。針對這種情況,有許多解決方案,而最簡單的方法就是建立一個自定義封裝元件來處理庫,這樣就可以在應用程式中實現重用。
實現概述
封裝元件的目的是通過將第三方庫所需的邏輯封裝起來以方便配置以及與Ext JS框架實現互動。對於在應用程式中使用多少第三方庫的API,有很大的自由度。如果庫相當簡單,且希望對API的訪問進行控制,那就可以將API的每一個方法都封裝為對應的方法。這樣就可以在想要引用額外的自定義邏輯的時候隱藏對不想公開的方法或攔截方法的呼叫。另一種方式是公開一些API中的根物件,以便其他控制元件可以自由的通過物件直接呼叫任何API方法。在大多數情況下,這可能是最終的解決辦法,不過,不同的專案會有不同。
為了演示這一方式,將為Leaflet建立一個封裝元件Leaflet是一個由Universal Mind的 Vladimir Agafonki建立的開源的Javascript地相簿。在應用程式中將使用這個封裝元件來顯示一張地圖,並提供一個按鈕來將地圖移動到一個指定位置。
Leaflet可以將來自許多不同的地圖服務的地圖塊整合起來,這樣就為地圖的顯示提供了極大的靈活性。在示例中,將使用CloudMade提供的地圖塊。可以到CloudMade的網站上註冊一個免費賬號,然後就可在後續的請求(後面的示例需要使用到)中使用獲得的API金鑰。要想了解更多的與地圖塊有關的資訊,可訪問Leaflet的網站。
新增庫引用
在應用程式中,首先要做的是在HTML檔案中新增庫的引用,這樣才可以使用庫。在示例中,需要在HEAD元素內新增兩行來引用Leaflet。在Leaflet快速入門指南的Leftlet安裝文件中可獲得更多的詳細資訊。
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5/leaflet.css" />
<script src="http://cdn.leafletjs.com/leaflet-0.5/leaflet.js"></script>
建立自定義元件
接下來要做的是從Ext.Component擴展出Leaflet的封裝元件。Ext.Component會使用一個空白的UI來搭建控制元件的骨架,不過,它提供了所有所需的框架方法以便讓它在任何佈局中都能執行得很好。
在整合第三方庫的時候,通常都需要配置和初始化它來滿足需求。對於示例,需要重寫afterRender方法來處理Leftlet的初始化。這個方法會在自定義元件渲染到DOM並準備好與使用者互動後執行。還需要新增類的別名和引用地圖的配置變數。
Ext.define('Ext.ux.LeafletMapView', {
extend: 'Ext.Component',
alias: 'widget.leafletmapview',
config:{
map: null
},
afterRender: function(t, eOpts){
this.callParent(arguments);
var leafletRef = window.L;
if (leafletRef == null){
this.update('No leaflet library loaded');
} else {
var map = L.map(this.getId());
map.setView([42.3583, -71.0603], 13);
this.setMap(map);
L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
key: 'YOUR_API_KEY',
styleId: 997,
maxZoom: 18
}).addTo(map);
}
}
});
下面逐句來研究一下afterRender的程式碼:
var leafletRef = window.L;
if (leafletRef == null){
this.update('No leaflet library loaded');
} else {
....
}
在這裡嘗試在window.L名稱空間中訪問Leaflet庫。如果不能獲取到庫的引用,就使用一個資訊來更新元件的html,提示載入庫時出錯。
var map = L.map(this.getId());
這裡將傳遞Ext JS的元件id來建立Leftlet地圖物件。預設情況下,由Ext.Component建立的HTML標記是DIV,而這正是Leaflet用來初始化地圖元件所需的。在這裡使用的是在渲染控制元件時Ext框架生成的id,而不是使用硬編碼的id來引用DIV。這樣的好處就是可以在應用程式中建立多個例項。
map.setView([42.3583, -71.0603], 13);
這句將地圖的位置設定為馬薩諸塞州的波士頓的緯度和經度,地圖的縮放等級為13。有許多線上工具可以用來查詢不同地點的緯度和經度。
this.setMap(map);
將地圖引用設定給map變數,這樣就可在後續程式碼中使用它來訪問地圖。
L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
key: 'YOUR_API_KEY',
styleId: 997,
maxZoom: 18
}).addTo(map);
這句程式碼將設定Leaflet使用CloudMade的地圖塊。假設你已經建立了一個賬號並註冊了你的應用程式,你就可以將得到一個API金鑰放到YOUR_API_KEY中。不用去擔心那個混亂的網址,當移動地圖的時候,Leaflet會動態去載入地圖塊。如果需要了解更多的資訊,建議檢視Leaflet的API文件。
到目前為止,已經建立好基本的地圖控制元件了,可以在應用程式中使用了。不過,實際上這還沒有完全實現。如果就這樣去使用它,會發現它並不是所期望的效果。地圖的尺寸並沒有填滿布局。Leaflet需要隨時呼叫名為invalidateSize()的方法來調整地圖的尺寸,並讓它渲染成這個尺寸。這個問題在封裝元件中很容易解決。可以重寫onResize方法來實現,這樣,佈局的尺寸變化就可以隨時呼叫地圖的invalidateSize方法。
新增以下程式碼到控制元件:
onResize: function(w, h, oW, oH){
this.callParent(arguments);
var map = this.getMap();
if (map){
map.invalidateSize();
}
}
這樣,佈局的改變且有一個有效的地圖引用就可以隨時進行呼叫。如果調整了尺寸,就會告訴Leaflet去執行invalidateSize方法。
現在,就可以在佈局中使用元件了,而且會看到地圖將在提供的佈局尺寸內顯示。如果佈局因瀏覽器調整尺寸或滑塊而改變,將會看到地圖應用了新的尺寸。在自定義的封裝元件中,通過了幾行程式碼就可以讓第三方庫Leaflet在Ext JS佈局系統執行得很好。
使用示例
下面建立一個簡單的Ext JS應用程式來使用這個新的封裝元件。
Ext.Loader.setConfig({
enabled: true,
paths:{
'Ext.ux':'ux'
}
});
Ext.require(['Ext.ux.LeafletMapView']);
Ext.onReady(function() {
Ext.create('Ext.container.Viewport', {
layout: 'vbox',
items: [
{
xtype: 'leafletmapview',
flex: 1,
width: '100%'
}
]
})
});
這裡建立了一個viewport來使用整個瀏覽器的尺寸並將地圖渲染到整個檢視。這樣,將會看到一個波士頓地區的大地圖以及一些簡單的縮放控制。
接下來要做的是處理地圖與外部控制元件的互動。下面將新增一個按鈕,當單擊它的時候,將地圖縮放到一個位置。根據Leaflet文件,這需要呼叫map物件的setView方法,並緯度和經度的座標陣列以及縮放等級傳遞給它。所要做的,就是公開封裝元件在afterRender方法中建立的map物件,然後在按鈕中訪問物件並呼叫它的方法。
在viewport的items陣列中地圖元件的上面新增以下程式碼:
{
xtype: 'button',
text: 'Show Buffalo',
listeners:{
click: function(){
var map = Ext.ComponentQuery.query("viewport leafletmapview")[0];
map.getMap().setView([42.8864, -78.8786], 13);
}
}
}
以上程式碼將顯示一個按鈕;當單擊它的時候,程式碼將嘗試去獲得地圖物件的引用,並更新檢視到新的位置。在Ext JS應用程式中,有許多方式來引用元件,包括控制器的refs、Ext.ComponentQuery()等等。對於當前示例來說,最方便的是使用元件查詢來找到在viewport中的地圖元件。一旦獲得引用,就可以呼叫getMap方法來獲得Leaflet的地圖例項並直接呼叫任何Leaflet的APi方法。
從這裡開始,就可以根據自己的需要來實現元件。可以針對所有的安裝引數新增配置屬性,這樣就可以使用Ext JS的配置引數代替第三方庫的約定來自定義元件的每一個例項。還可以新增新屬性來切換庫功能。例如,可以新增一個屬性來啟用Leaflet的定位功能,這樣就可通過瀏覽器的Geolocation API來找到你的位置。可以在我的GitHub庫找到更完整的示例。
小結
所有的庫都會有不同,且會出現更多的挑戰,不過,這個概念將有助於在Ext JS或Sencha Touch應用程式中整合他們。在Sencha市場或GitHUB已經有許多封裝元件,因此可能不需要建立你自己的封裝元件。如果找不到所需要的庫,那就要建立自己的封裝元件,並將它分享到Sencha開發社群。
相關推薦
【翻譯】在Ext JS整合第三方庫
作者:Kevin Kazmierczak Kevin Kazmierczak is a Senior Technical Architect at Universal Mind, an innovativ
【翻譯】Ext JS從頭開始之一
歡迎來到新的部落格系列“Ext JS從頭開始”的第一部分。為什麼要寫這個系列?嗯,在不斷收到客戶有關Ext JS學習曲線的反饋後,發現他們在學習Ext JS時所面臨的挑戰之一是缺乏基礎知識,或者是沒了解過Ext JS是如何運作的,他們只是學習了一種模式之後就
【react】利用prop-types第三方庫對元件的props中的變數進行型別檢測
1.安裝:npm install prop-types --save 2.使用 import React, { Component } from 'react'; import PropTypes
【原創】k8s原始碼分析------第三方庫etcd client分析
程式碼為github.com/coreos/go-etcd/etcd 注: 此版本為k8s v1.1.1 中所使用的etcd client。 首先我看下k8s中是如何使用的。位置在
【Python】安裝PyCharm+Python+第三方庫
安裝環境:win7_X64 PyCharm版本:pycharm-community-2018.2.2 Python版本:Python 3.6.5 1. 開啟PyCharm官網(www.jetbrains.com/pycharm/),點選右上角的Download,出現如下
【Kettle】數據整合之FTP下載+本地照片文件導入Oracle數據庫
存儲 oracle數據庫 ear 模型 記錄 new 基於 調整 replace 一、數據整合業務場景 1.1 背景 因GA某系統進行調整,導致原先從該系統備份數據庫獲取的相應數據資源無法正常獲取,後續的數據統一由GA某系統每日將前一日的ZTRY照片數據
【翻譯】2018年,20大Python資料科學庫都做了哪些更新?
Python今年依舊保持著資料科學領域的領先地位。去年,我們在部落格上列出了15個頂級Python資料科學庫的榜單,當時大家都覺得非常好。這次,介紹一下這些頂級資料科學Python庫今年有哪些更新,同時,我們還為這個榜單添加了一些新庫。 實際上,這次的榜單不止20個庫,主要
【已解決】C#中整合DLL庫到自己的exe程式中
【問題】 已經實現了下載ST歌曲的小程式,但是由於其中註冊快捷鍵的功能,需要呼叫額外的一個dll庫,Interop.SHDocVw.dll,所以釋出的時候,除了釋出一個單獨的exe之外,還需要連帶dll一起釋出,很是不爽。 希望將此dll整合到exe中。 【解決過程】 1.從:
【轉】五大主流數據庫比較 (DB2 Oracle MySQL SyBase SQLServer)
層次 tpc 數據 體系結構 pop 企業級 語言 數據庫管理 比較 無意中在網上看到,我看到的也是別人轉載的,作者不詳。 一、 開放性 1. SQL Server 只能在windows上運行,沒有絲毫的開放性,操作系統的系統的穩定對數據庫是十分重要的。Windo
【翻譯】 View Frustum Culling --1 View Frustum’s Shape
near com 矩形區域 狀態 翻譯 cnblogs 位置 移動 距離 這是一些列來自lighthouse3d的視錐體裁剪教程。旨在學習總結,及便於查閱。 1、視錐體的形狀 在OpenGL中,透視投影是由兩個函數定義的gluPerspective和gluLookAt
【翻譯】關於vertical-align所有你需要知道的
增加 大寫 內聯 簡單 -s 列表 fin 技術分享 解決方案 本文是翻譯過來的,如果有不對的地方還請指教~,原文鏈接:Vertical-Align: All You Need To Know 前面一些說明,可以略過不看吧 我經常需要對元素進行垂直方向上的布局。 CSS提供
【前端】Vue.js經典開源項目匯總
查詢 可見 專業 codec ssa mark 高級 coffee init Vue.js經典開源項目匯總 原文鏈接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什麽? Vue.js(讀音 /vju?/, 類似
【前端】vue.js實現按鈕的動態綁定
case ctype html 們的 ast pre cal 防止 得到 vue.js實現按鈕的動態綁定 實現效果: 實現代碼以及註釋: <!DOCTYPE html> <html> <head> <title>按鈕
【Java】操作mysql數據庫
nbsp port str ase .exe drive manager 執行 sel package bd; import java.sql.Connection; import java.sql.DriverManager; import java.sq
【翻譯】ASP.NET Core 文檔目錄
www asp nbsp .com col actions size 組件 ons 簡介 入門 創建一個Web應用程序 創建一個Web API 教程 基礎 MVC Razor Pages Razor 語法 Model 綁定
【轉】使用js觸發事件
rda ctype rem odi scroll cancel script 事件 some 如果大家將一張網頁看成一個form的話,大致上就成了一個web form的模型。在win form 下要想手動觸發某一個對象的事件是很簡單的,只要發送一條消息即可達成。
GTD190018:【翻譯】The Case Against Civilization
sed trait intervals cycle variety enter method nor get https://www.newyorker.com/magazine/2017/09/18/the-case-against-civilization
【轉】從msql數據庫處理高並發商品超賣
串行 顯示 字段 pre upd 缺點 訂單 commit 平時 今天王總又給我們上了一課,其實mysql處理高並發,防止庫存超賣的問題,在去年的時候,王總已經提過;但是很可惜,即使當時大家都聽懂了,但是在現實開發中,還是沒這方面的意識。今天就我的一些理解,整理一下這個問題
【翻譯】‘BadRabbit’ Ransomware Burrows Into Russia, Ukraine
ati exe rar product ner qcow dns query rep stream 【來源】 ‘BadRabbit’ Ransomware Burrows Into Russia, Ukraine By Raj Samani and Christiaan B
【分享】Web前端開發第三方插件大全
slim 語法 top 配件 svg 上下文菜單 meta 時序圖 nio 收集整理了一些Web前端開發比較成熟的第三方插件,分享給大家。 ******************************************************************