AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4

1.切换工作目录

git checkout step-4  #切换分支,切换到第4步
npm start #启动项目

2.代码


app/index.html


Search: <input ng-model="query">
Sort by:
<select ng-model="orderProp">
<option value="name">Alphabetical</option>
<option value="age">Newest</option>
</select>

<ul class="phones">
<li ng-repeat="phone in phones | filter:query | orderBy:orderProp">
{{phone.name}}
<p>{{phone.snippet}}</p>
</li>
</ul>

app/controllers.js


var phonecatApp = angular.module(‘phonecatApp‘, []);

phonecatApp.controller(‘PhoneListCtrl‘, function($scope) {
$scope.phones = [
{‘name‘: ‘Nexus S‘,
‘snippet‘: ‘Fast just got faster with Nexus S.‘,
‘age‘: 1},
{‘name‘: ‘Motorola XOOM? with Wi-Fi‘,
‘snippet‘: ‘The Next, Next Generation tablet.‘,
‘age‘: 2},
{‘name‘: ‘MOTOROLA XOOM?‘,
‘snippet‘: ‘The Next, Next Generation tablet.‘,
‘age‘: 3}
];

$scope.orderProp = ‘age‘;
});

3.效果


按字母排序:

按时间排序:

很明显,相较于step-3,step-4新增加了排序功能

4.原理说明


首先,添加了<select> 标签:

<select ng-model="orderProp">
<option value="name">Alphabetical</option>
<option value="age">Newest</option>
</select>

其次,在filter中添加了orderBy:

 <li ng-repeat="phone in phones | filter:query | orderBy:orderProp">
{{phone.name}}
<p>{{phone.snippet}}</p>
</li>

所以,根据angularjs的思想,一是model改变(可能是用户手动选择下拉框导致的),那么根据数据绑定原则(data-binding),view也将适时进行改变.

orderBy api:https://docs.angularjs.org/api/ng/filter/orderBy

orderBy Usage(用法)


In HTML Template Binding(在HTML中的用法)

{{ orderBy_expression | orderBy : expression : reverse}}

In JavaScript(在JS中的用法)

$filter(‘orderBy‘)(array, expression, reverse)

上面的例子是在HTML中用的,默认string类型的数据是按照字母表中数据排序的,而number数字类型的数据是按照数字大小进行排序的.

如果想要倒序,那么可以在上面的option value=‘-name‘,加上一个‘-‘即可.

5.测试


[email protected]-pc:~/develop/angular-phonecat$ npm run protractor

> [email protected]0.0.0 preprotractor /home/amosli/develop/angular-phonecat
> npm run update-webdriver

> [email protected]0.0.0 preupdate-webdriver /home/amosli/develop/angular-phonecat
> npm install

> [email protected]0.0.0 postinstall /home/amosli/develop/angular-phonecat
> bower install

> [email protected]0.0.0 update-webdriver /home/amosli/develop/angular-phonecat
> webdriver-manager update

selenium standalone is up to date.
chromedriver is up to date.

> [email protected]0.0.0 protractor /home/amosli/develop/angular-phonecat
> protractor test/protractor-conf.js

------------------------------------
PID: 5265 (capability: chrome #1)
------------------------------------

Using ChromeDriver directly...
..

Finished in 5.033 seconds
2 tests, 5 assertions, 0 failures

这里执行的是端到端的测试,测试代码如下:

angular-phonecat/test/e2e/scenarios.js

[email protected]:~/develop/angular-phonecat/test/e2e$ cat scenarios.js
‘use strict‘;

/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */

describe(‘PhoneCat App‘, function() {

describe(‘Phone list view‘, function() {

beforeEach(function() {
browser.get(‘app/index.html‘);
});

it(‘should filter the phone list as user types into the search box‘, function() {

var phoneList = element.all(by.repeater(‘phone in phones‘));
var query = element(by.model(‘query‘));

expect(phoneList.count()).toBe(3);

query.sendKeys(‘nexus‘);
expect(phoneList.count()).toBe(1);

query.clear();
query.sendKeys(‘motorola‘);
expect(phoneList.count()).toBe(2);
});

it(‘should be possible to control phone order via the drop down select box‘, function() {

var phoneNameColumn = element.all(by.repeater(‘phone in phones‘).column(‘{{phone.name}}‘));
var query = element(by.model(‘query‘));

function getNames() {
return phoneNameColumn.map(function(elm) {
return elm.getText();
});
}

query.sendKeys(‘tablet‘); //let‘s narrow the dataset to make the test assertions shorter

expect(getNames()).toEqual([
"Motorola XOOM\u2122 with Wi-Fi",
"MOTOROLA XOOM\u2122"
]);

element(by.model(‘orderProp‘)).findElement(by.css(‘option[value="name"]‘)).click();

expect(getNames()).toEqual([
"MOTOROLA XOOM\u2122",
"Motorola XOOM\u2122 with Wi-Fi"
]);
});
});
});

AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy
step4

时间: 2024-10-25 11:35:32

AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4的相关文章

vue中数据双向绑定的实现原理

vue中最常见的属v-model这个数据双向绑定了,很好奇它是如何实现的呢?尝试着用原生的JS去实现一下. 首先大致学习了解下Object.defineProperty()这个东东吧! * Object.defineProperty() * 对对象的属性进行 定义/修改 * */ let obj = {x:10} // 这两种方式都相对来说比较简单,直接,但是有些时候我们需要对对象的属性的修改和增加进行必要的干预 // obj.y = 20; // obj.x = 100; // obj.x =

vue中数据双向绑定注意点

最近一个vue和element的项目中遇到了一个问题: 动态生成的对象进行双向绑定是失败 直接贴代码: <el-form :model="addClass" :rules="rules" ref="addClass"> <el-form-item label="表单分类名称" prop="NAME" :label-width="formLabelWidth"> &

原生js实现数据双向绑定

最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里 缺点:一旦HTML代码生成就没有办法改变,如果有新数据重新传入,就必须重新把模板和数据整合到一起插入到文档流中 数据双向绑定 数据模型和视图之间的双向绑定,用户在视图上的修改会自动同步到数据模型中,同样的,如果数据模型中的值发生变化,也会同步到视图中去

我的angularjs源码学习之旅3——脏检测与数据双向绑定

前言 为了后面描述方便,我们将保存模块的对象modules叫做模块缓存.我们跟踪的例子如下 <div ng-app="myApp" ng-controller='myCtrl'> <input type="text" ng-model='name'/> <span style='width: 100px;height: 20px; margin-left: 300px;'>{{name}}</span> </di

AngularJS(2)——AngularJS数据双向绑定

双向绑定 AngularJS在$scope变量中使用脏值检测来实现了数据双向绑定. Scope作用: 1.通过数据共享连接Controller和View 2.事件的监听和响应 3.脏值检测和数据绑定 双向数据绑定最经常的应用场景就是表单了,这样当用户在前端页面完成输入后,不用任何操作,我们就已经拿到了用户的数据存放到数据模型中了.因为输入框中的ng-model和控制器中的数值实现了双向绑定,所以更改输入框的值或者更改控制器中的值,都会相应的更改双方的值.$scope对象,我们可以理解为NG框架中

AngularJS数据双向绑定

AngularJS是近些年流行的前端语言,通过新的属性和表达式扩展了HTML,克服了HTML在构建应用上的不足.Angular声明式的模板功能强大,自带了丰富的指令,是一个完善的前端MVVM框架,实现了数据双向绑定.过滤器.依赖注入.模块化.服务等功能.AngularJS实现数据双向绑定分别表现在与浏览器交互和与用户交互. 1.1.1 AugularJS与浏览器交互 当浏览器访问到AngularJS脚本时,浏览器做了如下操作: 加载html,对DOM进行解析: 加载angularJS脚本: An

Angular系列----AngularJS入门教程05:双向绑定(转载)

在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f step-4 你应该发现除了搜索框之外,你的应用多了一个下来菜单,它可以允许控制电话排列的顺序. 步骤3和步骤4之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 模板 app/index.html Search: <input ng-model="query"&g

[转载]AngularJS入门教程04:双向绑定

在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f step-4 你应该发现除了搜索框之外,你的应用多了一个下来菜单,它可以允许控制电话排列的顺序. 步骤3和步骤4之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 模板 app/index.html Search: <input ng-model="query"&g

AngularJS学习--- AngularJS中模板链接和图像 ng-src step6

接上一篇文章,本文将主要介绍angularjs中的模板链接,和图像显示? 首先,切换分支,启动项目: git checkout step-6 npm start 1.效果 相较于前一篇文章,明显感觉多了图片,那么这些图片是怎么加载进去的呢?这里图片各不一样,如果用传统的方式去加载图片可能要写很多代码,这里看一下angularjs是如何实现的?? 2.实现代码 app/index.html <ul class="phones"> <li ng-repeat="