Mobile Angular UI 笔记
项目中需要用到该组件,但是网上中文资料有限,所以在此进行了翻译下,以便后续方便查找使用,如遇描述不合理的地方,敬请纠正,谢谢。
官网地址:http://mobileangularui.com/
组件
tab 页签
<div ui-state="activeTab" default="1">
<ul class="nav nav-tabs">
<li ui-class="{'active': activeTab == 1}">
<a ui-set="{'activeTab': 1}">Tab 1</a>
</li>
<li ui-class="{'active': activeTab == 2}">
<a ui-set="{'activeTab': 2}">Tab 2</a>
</li>
<li ui-class="{'active': activeTab == 3}">
<a ui-set="{'activeTab': 3}">Tab 3</a>
</li>
</ul>
<div ui-if="activeTab == 1">
<h3 class="page-header">Tab 1</h3>
<p><!-- ... --></p>
</div>
<div ui-if="activeTab == 2">
<h3 class="page-header">Tab 2</h3>
<p><!-- ... --></p>
</div>
<div ui-if="activeTab == 3">
<h3 class="page-header">Tab 3</h3>
<p><!-- ... --></p>
</div>
</div>
开关按钮 ui-switch
<ui-switch ng-model="invoice.paid"></ui-switch>
段落 section
用于放主题内容,默认没有padding 和 背景色。与此类似的是具有padding和背景色.container-fluid
。
<div class="section">
<!-- contents -->
</div>
布局
-
section-wide
去除左右padding -
section-condensed
移除纵向padding -
section-break
增加 margin-bottom and shadow (非常适用于同一个视图中有多个section的情况) section-default
主题
.section-default
.section-primary
.section-success
.section-info
.section-warning
section-danger
<div class="section section-wide section-info">
<!-- contents -->
</div>
分段导航 Segmented Navigation
<div class="btn-group justified">
<a href="#/page1">Page 1</a>
<a href="#/page2">Page 2</a>
<a href="#/page3">Page 3</a>
</div>
模态框 Modals 和 Overlays
模态框与Bootstrap 3中的模态框类似,区别是这里通过ngIf
/uiIf
or ngHide
/uiHide
来隐藏和显示模态框,默认情况下设置的.modal
样式为显示状态.modal {display:block}
。可以与·ngAnimate
一起实现动画效果。
如果想让模态框覆盖整个页面,可以将模态框绑定为body
元素的子元素,一般会与指令contentFor
/yieldTo
一起使用。例如:
<body ng-app="myApp">
<!-- ... -->
<!-- Modals and Overlays -->
<div ui-yield-to="modals"></div>
</body>
<div ui-content-for="modals">
<div class="modal"><!-- ... --></div>
</div>
Modals
<div ui-content-for="modals">
<div class="modal" ui-if="modal1" ui-state='modal1'>
<div class="modal-backdrop in"></div>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close"
ui-turn-off="modal1">×</button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio quo illum nihil voluptatem earum optio repellendus, molestias illo facere, ea non. Possimus assumenda illo accusamus voluptatibus, vel corporis maxime quam.</p>
</div>
<div class="modal-footer">
<button ui-turn-off="modal1" class="btn btn-default">Close</button>
<button ui-turn-off="modal1" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</div>
Overlay
Overlay 跟modals相似,模糊的毛玻璃背景效果使它看起来更加接近手机原生模态框。通过增加.modal-overlay
样式实现。
<div ui-content-for="modals">
<div class="modal modal-overlay" ui-if='modal2' ui-state='modal2'>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close"
ui-turn-off="modal2">×</button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias, amet harum reiciendis enim adipisci magni fugit suscipit eaque corporis? Saepe eius ipsum optio dolorum a qui adipisci, reprehenderit totam temporibus!</p>
</div>
<div class="modal-footer">
<button ui-turn-off="modal2" class="btn btn-default">Close</button>
<button ui-turn-off="modal2" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</div>
可滚动区域 Scrollable Area
在写移动web应用时,我们通常需要处理滚动和position:fixed
的问题。
由于有些设备不支持fixed定位,而导致fixed定位元素会在滚动的过程中被隐藏。 旋转和滑块功能与滚动条也经常会存在冲突。
标记为可滚动区域的方式非常简单:
// 这段代码将触发指令,为.scrollable节点设置一个overthrow实例。
<div class="scrollable">
<div class="scrollable-content">...</div>
</div>
Headers and footers
设置.scrollable-header
/.scrollable-footer
样式类后,就不需要处理css高度和位置,就可以使得fixed定位的头部和底部不会与滚动造成冲突。
<div class="scrollable">
<div class="scrollable-header"><!-- ... --></div>
<div class="scrollable-content"><!-- ... --></div>
<div class="scrollable-footer"><!-- ... --></div>
</div>
下拉组件 Dropdowns
.dropdown-menu
默认总是显示可见的,所以你需要通过ui-show
/ui-hide
/ui-if
/ng-*
or ngAnimate
控制元素的隐藏显示动画效果。
<div class="scrollable">
<div class="scrollable-header"><!-- ... --></div>
<div class="scrollable-content"><!-- ... --></div>
<div class="scrollable-footer"><!-- ... --></div>
</div>
scrollTop.scrollable-content
控制器提供了scrollTo(offsetOrElement, margin)方法,
var elem = element(document.getElementById('myScrollableContent'));
var scrollableContentController = elem.controller('scrollableContent');
// - Scroll to top of containedElement
scrollableContentController.scrollTo(containedElement);
// - Scroll to top of containedElement with a margin of 10px;
scrollableContentController.scrollTo(containedElement, 10);
// - Scroll top by 200px;
scrollableContentController.scrollTo(200);
ui-scroll-bottom/ui-scroll-top
设置ui-scroll-bottom
/ui-scroll-top
指令,滚动到滚动区域边缘的能够触发特定事件。
<div class="scrollable">
<div class="scrollable-content section" ui-scroll-bottom="loadMore()">
<ul>
<li ng-repeat="item in items">
{{item.name}}
</li>
</ul>
</div>
</div>
手风琴 Accordion
<div class="panel-group" ui-state="myAccordion" ui-default="2">
<div class="panel panel-default" ng-repeat="i in [1,2,3]">
<div class="panel-heading" ui-set="{'myAccordion': i}">
<h4 class="panel-title">
Collapsible Group Item #{{i}}
</h4>
</div>
<div ui-if="myAccordion == {{i}}">
<div class="panel-body">
{{lorem}}
</div>
</div>
</div>
</div>
导航栏 Navbars
Bootstrap 默认的导航栏对于响应式页面是非常炫酷的,但对于小屏幕来说却不够友好,并且fixed定位也不能很好地区分定位顶部或者底部的位置。mobile angular ui提供了更加合适手机屏幕显示的导航栏。
下图展示了fixed
定位和absolute
定位的区别:
导航栏的基础样式 .navbar-app
,定位样式:.navbar-absolute-top
、 .navbar-absolute-bottom
,基本使用方式如下:
<div class="app">
<div class="navbar navbar-app navbar-absolute-top">
<!-- ... -->
</div>
<div class="navbar navbar-app navbar-absolute-bottom">
<!-- ... -->
</div>
<div class="app-body">
<ng-view></ng-view>
</div>
</div>
顶部导航栏通常结构为:一个或两个动作按钮包围的居中标题,常见的有返回按钮或菜单按钮。.navbar-brand-center
能够确保标题居中且不会覆盖两边的按钮。参考如下布局:
<div class="navbar navbar-app navbar-absolute-top">
<div class="navbar-brand navbar-brand-center">
Navbar Brand
</div>
<div class="btn-group pull-left">
<div class="btn btn-navbar">
Left Action
</div>
</div>
<div class="btn-group pull-right">
<div class="btn btn-navbar">
Right Action
</div>
</div>
</div>
侧边栏 sidebars
增加.sidebar-left
and .sidebar-right
样式,可以实现左、右边栏。
<div class="sidebar sidebar-left">
<div class="scrollable">
<h1 class="scrollable-header app-name">My App</h1>
<div class="scrollable-content">
<div class="list-group" ui-turn-off='uiSidebarLeft'>
<a class="list-group-item" href="#/link1">Link 1
<i class="fa fa-chevron-right pull-right"></i></a>
<a class="list-group-item" href="#/link2">Link 2
<i class="fa fa-chevron-right pull-right"></i></a>
</div>
</div>
</div>
</div>
<div class="sidebar sidebar-right">
<!-- -->
</div>
侧边栏交互: 引擎栏通过SharedState暴露各自的状态:uiSidebarLeft 和 uiSidebarRight。使用ui-turn-off='uiSidebarLeft' 或者 ui-turn-off='uiSidebarLeft' 切换侧边栏的状态,侧边栏外部进行点击时默认会关闭侧边栏。
SharedState 服务方法
SharedState
中的共享状态可以被认为是一个由id标识的全局变量。SharedState
服务提供了外部方法用于创建。它充当UI元素之间的总线,在UI之间以共享状态。保留状态的数据结构不在angularJS scope范围内,因此它们不会只有在需要的时候才会进行脏检查(暂未能理解)。当没有scope进行引用时,共享状态会自行销毁。
所有 ui-*
指令都能与SharedState模块进行交互,比传统的angularjs更有优势。
// 传统scope变量
$scope.activeTab = 1;
$scope.setActiveTab = function(n) {
$scope.activeTab = n;
};
initialize
SharedState.initialize(scope, id, [options])
initialize
通过ID定义scope绑定的状态,并且使得该变量在其他模块应用中可以进行共享。 一个共享状态可以绑定到一个或者多个scope中,并在垃圾收集器当中计算绑定数量,当scope销毁时对应的绑定数量也会相应递减,当绑定数量为0时,这个状态就会自行销毁。
参数 | 类型 | 描述 |
---|---|---|
scope | scope | 绑定状态的域 |
id | string | 唯一的状态名称 |
[options] | object | 选项 |
[options.defaultValue] | object | 初始化状态值,只有在状态还未初始化时有效 |
[options.exclusionGroup] | string | 为状态定义排除组,意为:如果组内的一个状态被设置为true,那组内的其他状态将被自动赋值为false,单选按钮组案例如下: |
<div class="btn-group">
<a href class="btn btn-default" ui-turn-on="button1" ui-shared-state="button1" ui-class="{'active': button1}" ui-exclusion-group="myButtons">1</a>
<a href class="btn btn-default" ui-turn-on="button2" ui-shared-state="button2" ui-class="{'active': button2}" ui-exclusion-group="myButtons">2</a>
<a href class="btn btn-default" ui-turn-on="button3" ui-shared-state="button3" ui-class="{'active': button3}" ui-exclusion-group="myButtons">3</a>
</div>
setOne
SharedState.setOne(id, value)
给一个状态赋值。
setMany
SharedState.setMany(object)
给多个状态赋值,例如:
SharedState.setMany({ activeTab: 'firstTab', sidebarIn: false });
set
SharedState.set(idOrMap, [value])
是setOne
和 setMany
的统一写法。当只有一个参数,且参数为Object时相当于setMany
,当有两个参数,且第一个参数为string时,相当于setOne
。
turnOn
SharedState.turnOn(id)
将状态设置为true
, 如果状态初始化时有设置exclusionGroup
则同时会将组内其他状态设置为false(turn off)。
turnOff
与 turnOn
作用相反。需注意,初始化时的exclusionGroup
参数对它依然有效。
toggle
SharedState.toggle(id)
将状态设置为相反的值。
get
SharedState.get(id) ⟶ any
获取状态值
isActive
SharedState.isActive(id) ⟶ bool
判断状态值是否为true
active
SharedState.active(id) ⟶ bool
是isActive
的别名
isUndefined
SharedState.isUndefined(id) ⟶ bool
判断状态是否未定义
has
SharedState.has(id) ⟶ bool
判断状态是否存在
referenceCount
SharedState.referenceCount(id) ⟶ integer
获取状态关联的数量
equal
SharedState.equals(id, value) ⟶ bool
判断状态值是否全等于(===)value
eq
是equal
的别名
values
SharedState.values() ⟶ object
获取所有状态值,返回格式为 {statusId: statusValue}
。需记住它只是返回克隆值,记录当前的状态值,并不会对后续修改进行追踪记录。
ShareState 服务事件
http://mobileangularui.com/do...:mobile-angular-ui/module:core/module:sharedstate/
mobile-angular-ui.state.initialized.ID
当状态初始化时会在$rootScope
上进行广播该事件
mobile-angular-ui.state.destroyed.ID
当状态销毁时会在$rootScope
上进行广播该事件
mobile-angular-ui.state.changed.ID
当状态值改变时会在$rootScope
上进行广播该事件
$scope.$on('mobile-angular-ui.state.changed.uiSidebarLeft', function(e, newVal, oldVal) {
if (newVal === true) {
console.log('sidebar opened');
} else {
console.log('sidebar closed');
}
});
指令
ui-shared-state
调用SharedState#initialize方法进行初始化值,可同时设置默认值ui-default = ''
Sharestate服务和ui-命令:ShareState允许使用最基本的angular和富angular命令去创建复杂的组件:
- 只用HTMl就可以创建复杂的组件
- 使你的控制器脱离UI逻辑
- 使得ng-click可以做其他的事情
- 任何一个时间都可以触发UI的动作
- 把组件状态发送给URL
- 用剩下的UI分享组件的情形
不适用状态分享服务的处理方式
app.controller(function($scope){
$scope.activeTab = 1;
$scope.setActiveTab = function(tab){
$scope.activeTab = tab;
};
});
<div class="tab-nav">
<a ng-click="setActiveTab(1)">Tab1</a>
<a ng-click="setActiveTab(2)">Tab2</a>
<a ng-click="setActiveTab(3)">Tab3</a>
</div>
<div class="tabs">
<div ng-if="activeTab == 1">Tab1</div>
<div ng-if="activeTab == 2">Tab2</div>
<div ng-if="activeTab == 3">Tab3</div>
</div>
ui-shared-state 创建了一种可以在声明的被绑定的元素内可以随时访问的全局变量。
<div class="tab-nav" ui-state='activeTab'>
<a ui-set="{activeTab: 1}">Tab1</a>
<a ui-set="{activeTab: 2}">Tab2</a>
<a ui-set="{activeTab: 3}">Tab3</a>
</div>
<div class="tabs">
<div ui-if="activeTab == 1">Tab1</div>
<div ui-if="activeTab == 2">Tab2</div>
<div ui-if="activeTab == 3">Tab3</div>
</div>
ui-state
已被弃用
ui-class
ui-class
为 ng-class
的简化版,用来获取SharedState
中的值,语法只能为: {'className': expr}
<ui-shared-state id="activeTab" default="1"></ui-shared-state>
<ul class="nav nav-tabs">
<li ui-class="{'active': activeTab == 1}">
<a ui-set="{'activeTab': 1}">Tab 1</a>
</li>
<li ui-class="{'active': activeTab == 2}">
<a ui-set="{'activeTab': 2}">Tab 2</a>
</li>
</ul>
<div ui-if="activeTab == 1">
<h3 class="page-header">Tab 1</h3>
<p>{{lorem}}</p>
</div>
<div ui-if="activeTab == 2">
<h3 class="page-header">Tab 2</h3>
<p>{{lorem}}</p>
</div>
ui-if、ui-show 、 ui-hide
与 ng-if
、ng-show
、ui-hide
类似,不过ui-if
、ui-show
、`ui-hide'针对SharedState中的状态
<a class="btn btn-block btn-lg btn-primary scrollable-footer" ui-toggle="searchBar">
<i class="fa fa-search"></i>
<span ui-hide="searchBar">Show</span>
<span ui-show="searchBar">Hide</span>
Search Bar
</a>
ui-toggle、ui-turnOff、ui-turnOn、ui-set
当元素上的事件触发时会调用sharedstate#toggle
、sharedstate#turnOff
、sharedstate#turnOn
、SharedState#set
方法对状态进行切换、关闭、打开、设置为对应值。
ui-exclusion-group
该指令即 initialize
方法中[options.exclusionGroup]参数:SharedState.initialize(scope, id, [options])
手势
过拽drag
http://mobileangularui.com/do...:mobile-angular-ui/module:gestures/module:drag/
var dragOptions = {
transform: $drag.TRANSLATE_BOTH,
start: function(dragInfo, event){},
end: function(dragInfo, event){},
move: function(dragInfo, event){},
cancel: function(dragInfo, event){}
};
$drag.bind(element, dragOptions, touchOptions);
swipe
http://mobileangularui.com/do...:mobile-angular-ui/module:gestures/module:swipe/
触摸 touch
http://mobileangularui.com/do...:mobile-angular-ui/module:gestures/module:touch/
转换 transform
http://mobileangularui.com/do...:mobile-angular-ui/module:gestures/module:transform/
core模块
activeLinks
http://mobileangularui.com/do...:mobile-angular-ui/module:core/module:activelinks/
capture
http://mobileangularui.com/do...:mobile-angular-ui/module:core/module:capture/
ui-yield-to
定义了一个占位符,内部html被认为是默认的。其内容将被ui-content-for
指令进一步替换。
// home.html
<div class="navbar navbar-app navbar-absolute-top">
<div class="navbar-brand navbar-brand-center" ui-yield-to="title">
首页 <!-- 这里是默认title,当进入accordion.html页面时会被替换为ui-content-for="title"中的内容 -->
</div>
<div class="btn-group pull-left">
<!-- -->
</div>
<div class="btn-group pull-right" ui-yield-to="navbarAction">
<!-- -->
</div>
</div>
// accordion.html
<div ui-content-for="title">
<span>Accordion</span>
</div>
<!-- -->
outerClick
提供指令,指定点击/点按事件发生在元素外部时的行为。例如用来点击菜单外部元素时关闭菜单。
<div class="btn-group">
<a ui-turn-on='myDropdown' class='btn'>
<i class="fa fa-ellipsis-v"></i>
</a>
<ul
class="dropdown-menu"
ui-outer-click="Ui.turnOff('myDropdown')"
ui-outer-click-if="Ui.active('myDropdown')"
role="menu"
ui-show="myDropdown"
ui-shared-state="myDropdown"
ui-turn-off="myDropdown">
<li><a>Action</a></li>
<li><a>Another action</a></li>
<li><a>Something else here</a></li>
<li class="divider"></li>
<li><a>Separated link</a></li>
</ul>
</div>
touchmoveDefaults
http://mobileangularui.com/do...:mobile-angular-ui/module:core/module:touchmovedefaults/
提供指令和服务阻止鼠标移动时的默认行为。ui-prevent-touchmove-defaults
该指令通过touchmove.preventDefault
实现取消触摸事件时元素的默认行为。
<body ng-app='myApp' ui-prevent-touchmove-defaults>
<!-- ... -->
</body>
如果你希望内部元素保持默认的触摸行为,如滚动,你可以通过给元素增加scrollable
指令实现,也可以通过allowTouchmoveDefault服务恢复默认行为,即:
allowTouchmoveDefault
服务
// 恢复默认的触摸行为
allowTouchmoveDefault(myelem);
// 在满足条件的情况下恢复元素默认的触摸行为
allowTouchmoveDefault(myelem, function(touchmove){
return touchmove.pageY > 100;
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。