- 浏览: 3518354 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:37579
-
Cordova 3.x入门...
浏览量:604650
-
常用Java开源Libra...
浏览量:678516
-
搭建 CentOS 6 服...
浏览量:87540
-
Spring Boot 入...
浏览量:400045
-
基于Spring Secu...
浏览量:69129
-
MQTT入门
浏览量:90644
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
【官方地址】https://wiki.appcelerator.org/display/guides/Callbacks+and+Events+for+Loose+Coupling
我们在阅读了Appcelerator wiki中的“JavaScript最佳实践”之后都应该知道,使用全局变量或者破坏全局命名空间是编写高质量,可维护代码的禁忌。然而我们也知道旧的习惯是很难改的,我们在写代码时需要“this”来设值?只能创建一个全局变量来使用了。
通过这种方法解决问题最终他还会为我们带来麻烦。我们暂时忘记全局变量,将会有另外一种方法来得到同样的信息。
这里需要我们写在黄色便签上,让我们重视的有三点:
1、我们将要编写的是模块化代码(至少从现在开始)
2、基于事件的编程是很好的
3、只有在不得已的时候再使用全局变量
获取地理信息
这里,首先问题是什么?获取用户的当前地理位置信息。
这个处理会被异步执行,我们要更新的UI控件在另外一个文件中,当然,这是一个模块话的代码。
我们都知道通过调用API Titanium.Geolocation.getCurrentPosition使用回调函数来让我们知道什么时候它找到了地理位置信息。
把地理位置信息放在有用的地方
这里我们可以在回调函数的外边创建一个全局变量,来使用它获取信息。
但是这仅仅是帮助了我们,如果需要更新的UI控件跟回调处于同一个JS文件的情况。这不足以是我们写出模块化的代码。我们绝不能将UI代码和获取地理位置信息的逻辑代码混淆在一起。
通过事件监听把地理位置信息放在更好的地方
那么我们下来该做什么?首先是要摆脱全局变量,激发一个事件来指示地理位置信息已经成功被取到。
这样,在应用的任何我们需要获取地理位置信息的地方,我们都可以创建一个监听来获得坐标信息。这样很棒,不再需要全局变量了!
也有另外一种方法:在回调中使用回调
我们在设备获取地理位置信息完成后调用一个函数。和激发一个事件一样,我们将调用一个函数,把我们从设备上获取到的地理位置信息坐标作为参数传给它。
在我们代码的其他地方,我们需要获得信息后把信息更新到UI控件上。
Kevi说模块化是最好的
Kevin Whinnery: Write Better JavaScript: video| slides
好,我们现在已经在包含文件中有了GPS代码,它和UI代码分离,我们可以在任何需要获取地理位置信息的地方调用它,或者是一个事件,或者是一个回调函数。但是,我们还是没有做到-模块化CommonJS,还有“requires”的一切。
我们想做一个好的Appcelerator市民,编写出比Kitchen-sink更强大的代码。KitchenSink 毕竟只是一个演示API功能的,它并不是最好的例子。
这里让我们把我们的地理位置信息文件转化成一个模块。只需要在函数名之前加一个“exports”,并保证其公有。
在我们的ui.js文件的创建窗口的位置,我们需要加载这个含有地理位置信息取得的模块。完整的例子,我们把文件命名为“maps.js”。我们需要添加一下语句:
记住:在使用requie时不需要包含".js"扩展名,他不需要。
当你调用方法时:
这里是完整的ui.js:
总结
使用回调和事件对你的代码是有益的。它减少耦合,更好的分离业务逻辑和表现层。从现在开始,我们将在应用开发中更加强化模块化代码,这将放映在不久以后我们带给你所有的内容之中。
Keep coding strong!
代码
CallbacksAreYourFriend on Github
我们在阅读了Appcelerator wiki中的“JavaScript最佳实践”之后都应该知道,使用全局变量或者破坏全局命名空间是编写高质量,可维护代码的禁忌。然而我们也知道旧的习惯是很难改的,我们在写代码时需要“this”来设值?只能创建一个全局变量来使用了。
通过这种方法解决问题最终他还会为我们带来麻烦。我们暂时忘记全局变量,将会有另外一种方法来得到同样的信息。
这里需要我们写在黄色便签上,让我们重视的有三点:
1、我们将要编写的是模块化代码(至少从现在开始)
2、基于事件的编程是很好的
3、只有在不得已的时候再使用全局变量
获取地理信息
这里,首先问题是什么?获取用户的当前地理位置信息。
这个处理会被异步执行,我们要更新的UI控件在另外一个文件中,当然,这是一个模块话的代码。
我们都知道通过调用API Titanium.Geolocation.getCurrentPosition使用回调函数来让我们知道什么时候它找到了地理位置信息。
Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST; Titanium.Geolocation.distanceFilter = .25; Ti.Geolocation.purpose = "Callbacks Are Your Friend"; // 调用API Ti.Geolocation.getCurrentPosition(function(e) { // 当获取位置信息出错时 if (e.error) { Ti.API.error('geo - current position' + e.error); return; } // 获取地理位置信息 Ti.App.info('got a location ',JSON.stringify(e)); });
把地理位置信息放在有用的地方
这里我们可以在回调函数的外边创建一个全局变量,来使用它获取信息。
Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST; Titanium.Geolocation.distanceFilter = .25; Ti.Geolocation.purpose = "Callbacks Are Your Friend"; // 在回调中保存的坐标信息(全局) var global_var_coords; // 调用API Ti.Geolocation.getCurrentPosition(function(e) { // 当获取位置信息出错时 if (e.error) { Ti.API.error('geo - current position' + e.error); return; } // 获取地理位置信息 Ti.App.info('got a location ',JSON.stringify(e)); // 给全局变量赋值 global_var_coords = e.coords });
但是这仅仅是帮助了我们,如果需要更新的UI控件跟回调处于同一个JS文件的情况。这不足以是我们写出模块化的代码。我们绝不能将UI代码和获取地理位置信息的逻辑代码混淆在一起。
通过事件监听把地理位置信息放在更好的地方
那么我们下来该做什么?首先是要摆脱全局变量,激发一个事件来指示地理位置信息已经成功被取到。
Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST; Titanium.Geolocation.distanceFilter = .25; Ti.Geolocation.purpose = "Callbacks Are Your Friend"; // 全局监听 Ti.App.addEventListener('location.updated',function(coords){ Ti.API.debug(JSON.stringify(coords)); } // 调用API Ti.Geolocation.getCurrentPosition(function(e) { // 当获取位置信息出错时 if (e.error) { Ti.API.error('geo - current position' + e.error); return; } // 获取地理位置信息 Ti.App.info('got a location ',JSON.stringify(e)); // 激发含有地理位置信息的事件 Ti.App.fireEvent('location.updated',e.coords); });
这样,在应用的任何我们需要获取地理位置信息的地方,我们都可以创建一个监听来获得坐标信息。这样很棒,不再需要全局变量了!
也有另外一种方法:在回调中使用回调
我们在设备获取地理位置信息完成后调用一个函数。和激发一个事件一样,我们将调用一个函数,把我们从设备上获取到的地理位置信息坐标作为参数传给它。
// // file_with_location.js // Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST; Titanium.Geolocation.distanceFilter = .25; Ti.Geolocation.purpose = "Callbacks Are Your Friend"; /** * @param {Object} _callback 地理位置信息查询完成后调用 */ function currentLocation(_callback) { // 调用API Ti.Geolocation.getCurrentPosition(function(e) { // 当获取位置信息出错时 if (e.error) { Ti.API.error('geo - current position' + e.error); // to keep it simple, just returning null, could be // error information if (_callback) { _callback(null); } return; } // 获取地理位置信息 Ti.App.info('got a location ',JSON.stringify(e)); // 激发含有地理位置信息的事件 Ti.App.fireEvent('location.updated',e.coords); // 用坐标调用回调函数 if (_callback) { _callback(e.coords); } }); }
在我们代码的其他地方,我们需要获得信息后把信息更新到UI控件上。
Ti.include('file_with_location.js'); // 打开一个窗口 var window = Ti.UI.createWindow({ backgroundColor:'white' }); var coordsLbl = Titanium.UI.createLabel({ text:"NO LOCATION", left: 10, width: 240, height: 'auto', top: 20, textAlign: 'left', }); window.add(coordsLbl); window.open(); // 执行回调获取地理位置信息, gpsCallback方法被传入获取地理位置信息的方法 // 他将在获取到地理位置信息伙子出错的时候被调用 currentLocation(gpsCallback); /** * @param {Object} _coords 地理位置信息的经纬度值 */ function gpsCallback(_coords) { if (_coords) { coordsLbl.text = String.format("lon: %s\n lat: %s ", _coords.longitude + "", _coords.latitude + ""); } else { coordsLbl.text = "NO LOCATION"; } }
Kevi说模块化是最好的
Kevin Whinnery: Write Better JavaScript: video| slides
好,我们现在已经在包含文件中有了GPS代码,它和UI代码分离,我们可以在任何需要获取地理位置信息的地方调用它,或者是一个事件,或者是一个回调函数。但是,我们还是没有做到-模块化CommonJS,还有“requires”的一切。
我们想做一个好的Appcelerator市民,编写出比Kitchen-sink更强大的代码。KitchenSink 毕竟只是一个演示API功能的,它并不是最好的例子。
这里让我们把我们的地理位置信息文件转化成一个模块。只需要在函数名之前加一个“exports”,并保证其公有。
// Titanium.Geolocation.accuracy = Titanium.Geolocation.ACCURACY_BEST; Titanium.Geolocation.distanceFilter = .25; Ti.Geolocation.purpose = "Callbacks Are Your Friend"; // PUBLIC FUNCTION /** * @param {Object} _callback 地理位置信息查询完成后调用 */ exports.currentLocation = function(_callback) { Titanium.Geolocation.getCurrentPosition(function(e) { if(e.error) { alert('error ' + JSON.stringify(e.error)); // 为了保持一致,返回null if(_callback) { _callback(null); } return; } Ti.App.fireEvent('location.updated', e.coords); if(_callback) { _callback(e.coords); } }); };
在我们的ui.js文件的创建窗口的位置,我们需要加载这个含有地理位置信息取得的模块。完整的例子,我们把文件命名为“maps.js”。我们需要添加一下语句:
引用
require
记住:在使用requie时不需要包含".js"扩展名,他不需要。
var maps = require('lib/maps');
当你调用方法时:
// do the callback to get current location maps.currentLocation(gpsCallback);
这里是完整的ui.js:
// private vars var mainWindow, callback_label_coords; var styles = require('styles'); var maps = require('lib/maps'); /** * @param {Object} args properties for the window */ exports.AppWindow = function(args) { var instance, event_label, callback_label; // create window instance = Ti.UI.createWindow(args); // make callback label callback_label = Ti.UI.createLabel(styles.callback_label); instance.add(callback_label); callback_label_coords = Ti.UI.createLabel(styles.coords_label); instance.add(callback_label_coords); // make event listener label event_label = Ti.UI.createLabel(styles.event_label); instance.add(event_label); event_label_coords = Ti.UI.createLabel(styles.coords_label); instance.add(event_label_coords); // create event Listener Ti.App.addEventListener('location.updated', function(_coords) { event_label_coords.text = String.format("longitude: %s\n latitude: %s ", _coords.longitude + "", _coords.latitude + ""); }); // do the callback to get current location maps.currentLocation(gpsCallback); // save the window mainWindow = instance; return instance; }; /** * @param {Object} _coords lat, lon values from locationo */ function gpsCallback(_coords) { callback_label_coords.text = String.format("longitude: %s\n latitude: %s ", _coords.longitude + "", _coords.latitude + ""); }
总结
使用回调和事件对你的代码是有益的。它减少耦合,更好的分离业务逻辑和表现层。从现在开始,我们将在应用开发中更加强化模块化代码,这将放映在不久以后我们带给你所有的内容之中。
Keep coding strong!
代码
CallbacksAreYourFriend on Github
发表评论
-
VisualUI for Titanium Studio
2014-01-13 09:02 1493VisualUI for Titanium Studio is ... -
Google Auth (OAuth 2.0) for Titanium
2013-03-19 11:49 2010Google OAuth 2.0 for Titanium i ... -
Appcelerator Titanium: Up and Running
2013-03-19 08:40 46Appcelerator Titanium: Up and R ... -
Titanium SDK/Studio 3.0.0 Beta版发布
2012-11-07 09:36 463Titanium SDK/Studio 3.0.0 Beta版 ... -
Titanium SDK 3.0.0 Developer Preview
2012-10-29 16:15 303Titanium SDK 3.0.0 Developer Pr ... -
Appcelerator Partners With Largest Chinese Software Developer Network
2012-10-29 12:01 225(Marketwire - Oct 19, 2012) -Ap ... -
Titanium 3.0 预定10月份发布
2012-09-27 09:12 733Appcelerator CEO Jeff Haynie和 C ... -
Titanium SDK 2.1.3 RC is released – Support for iOS 6
2012-09-21 13:51 241---以下官方原文--- We understand the ... -
国内Ti开发者Winson的CBMVC框架
2012-08-06 15:55 1206目前关注Titanium的开发 ... -
Titanium的MVC框架"Alloy"的介绍
2012-07-18 14:37 4213Alloy(合金)是Appcelerator公司为Titani ... -
TCAD免费考试延长至7月末
2012-07-17 16:09 327Appcelerator延长这次TCAD免费考试的时间到7月末 ... -
TCAD认证考试
2012-07-13 11:31 2501Appcelerator从7/7开始免费开放TCAD(Tita ... -
【转】Appcelerator Cloud Push Notification in iPhone
2012-07-12 08:49 2713Push Notification in iOS Using ... -
【转】Appcelerator Cloud Push Notification in Android
2012-07-12 08:38 2441What is Push Notification? Push ... -
Appcelerator Titanium: Patterns and Best Practices
2012-07-10 10:58 373Appcelerator Titanium: Patterns ... -
Appceleator Cloud Services使用指南(3) - API Reference V1 (chm版本)
2012-05-28 15:22 1807Appceleator Cloud Services API ... -
Appceleator Cloud Services使用指南(2) - 创建第一个应用
2012-05-24 21:57 1689一步一步的创建一个最简单的,使用了ACS服务的应用。 1、新 ... -
Appceleator Cloud Services使用指南(1) - ACS介绍
2012-05-24 10:19 3207Appceleator Cloud Services( ... -
Titanium Mobile基础教程视频
2012-05-23 10:38 639dotinstall.com提供的一套在线Titanium M ... -
Jeff Haynie在GMIC2012表示应用开发者应注意本土化问题
2012-05-22 16:56 3355月10日-11日,2012全球移 ...
相关推荐
TiInspector, 通过 Chrome DevTools调试 Titanium Mobile 应用程序 #Ti 检查器Ti检查器允许在 Chrome DevTools web界面中调试 ...工具通过将命令和消息转换为 Chrome 调试协议和 Titanium 调试器协议( 反之亦然)
安卓手机系统备软件 第一次使用钛备份的朋友,可以试着...接着按返回键(手机底部四大金刚中的那个返回键)按钮逐层回退,然后选择sdcard-ext/TitaniumBackup即可(没有 TitaniumBackup文件夹的请自行创建一个):
会话和事件回调 禁用跟踪 离线模式 事件缓冲 GDPR被遗忘的权利 禁用第三方共享 SDK签名 后台跟踪 设备ID iOS广告识别码 Google Play服务广告标识符 亚马逊广告标识符 调整设备标识符 用户归因 推送令牌 预先安装的...
Titanium Backup_3.7.4捐赠完全版
[Packt Publishing] Appcelerator Titanium 移动应用开发教程 (英文版) [Packt Publishing] Creating Mobile Apps with Appcelerator Titanium (E-Book) ☆ 图书概要:☆ Develop fully-featured mobile ...
Titanium中文版开发手册(翻译版)
TitaniumBackup_6.0.5.1 专业版 可静默恢复
titanium-d1-kickstart.6.1.1.gbin 强大的思科模拟器
Google-Cloud-Messaging--Titanium-, 在 Titanium 中,Google云消息传递 Google-Cloud-Messaging--Titanium -注册带有GCM和处理发送到设备的通知的Titanium MODULE 。Android平台使用c2dm进行推送,但是因为c2dm停止...
Titanium[1].Backup.Pro.v3.7.2_cnFixed_newkey.apk Titanium[1].Backup.Pro.v3.7.2_cnFixed_newkey.apk
Titanium官方移动终端开发API文档
这是截至到目前最新的版本(Titanium 2.1 API) 方便没网的情况下,童鞋们翻阅文档。
atom-titanium, 用于 Titanium 合金的Atom 封装 用于 Titanium 合金的 All-in-One封装这是一个用于 Titanium 合金的Atom 封装。$ apm install titanium-alloy冲突&需要通知Alloy 1.8. x
钛备份 Titanium Backup,备份你的程序及程序数据,并支持定时备份等功能。 功能很强大,有此软件,不管你的格机还是重刷ROM,在重装软件时都是无痛的,非实适用经常捣鼓手机有机友! 解锁器使用说明: 1.安装钛...
针对titanium程序,在启动程序的时候首先应该检查一下网络设置是否正确,假如网络没有打开网络设置,则提示用户打开网络设置,当用户点击打开网络设置的按钮后即转到打开网络设置的地方进行网络设置。
前端开源库-node-titanium-sdk节点Titanium SDK,Appcelerator Titanium SDK库
Titanium使用JavaScript来开发原生iOSAndroid和Windows应用
Android-titanium_mobile.zip,带有javascript的本地ios、android和windows应用程序,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
Titanium_ziliao.all about my project
先进的计算、作图和分析功能,使得解决数学和工程领域的问题变得无比容易。它不仅适用于高等数学、线性代数、概率和统计等大学数学课程的学习,同时也是电子电气等...附件包含TI-89 Titanium的固件和安卓上的模拟器。