首页 > 编程知识 正文

angularjs的callback(AngularJS表达式)

时间:2023-12-01 15:00:21 阅读:310980 作者:UTUO

本文目录一览:

  • 1、angularjs使用jsonp跨域报错success_jsonpCallback is not defined
  • 2、angularjs的¥q的用法
  • 3、如何运行angularjs应用
  • 4、AngularJS如何调用外部接口?

angularjs使用jsonp跨域报错success_jsonpCallback is not defined

jsonp异步请求是执行了A后,不管A是否执行成功都可以再往下继续执行B,C,D;succes

angularjs的¥q的用法

在用JQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。

Promise

Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。

我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。

ES6中Promise、angularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下:

每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。

1.pending状态:可以过渡到履行或拒绝状态。

2.fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。

3.rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。

状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。

复制代码代码如下:

function okToGreet(name){

return name === 'Robin Hood';

}

function asyncGreet(name) {

var deferred = $q.defer();

setTimeout(function() {

// 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变

$scope.$apply(function() {

deferred.notify('About to greet ' + name + '.');

if (okToGreet(name)) {

deferred.resolve('Hello, ' + name + '!');

} else {

deferred.reject('Greeting ' + name + ' is not allowed.');

}

});

}, 1000);

return deferred.promise;

}

var promise = asyncGreet('Robin Hood');

promise.then(function(greeting) {

alert('Success: ' + greeting);

}, function(reason) {

alert('Failed: ' + reason);

}, function(update) {

alert('Got notification: ' + update);

});

Q Promise的基本用法

上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步操作成功,则用resolve方法将Promise对象的状态变为“成功”(即从pending变为resolved);如果异步操作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。

JS将要有原生Promise,ES6中已经有Promise对象,firefox和Chrome 32 beta版本已经实现了基本的Promise API

AngularJs中的$q.defferd

通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将Promises/A规范中的三个任务状态通过API关联。

deffered API

deffered 对象的方法

1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。

2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。

3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。

deffered 对象属性

promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。

Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

promise 对象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。

2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅 完整文档规范.

通过then()方法可以实现promise链式调用。

复制代码代码如下:

promiseB = promiseA.then(function(result) {

return result + 1;

});

// promiseB 将会在处理完 promiseA 之后立刻被处理,

// 并且其 value值是promiseA的结果增加1

$q的其他方法

$q.when(value):传递变量值,promise.then()执行成功回调

$q.all(promises):多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象

如何运行angularjs应用

 如何利用AngularJS服务接入外部API

除了轻松对HTML进行扩展的能力之外,AngularJS还提供一套简便途径、帮助我们与外部API实现交互。在今天的教程中,我们将共同探讨如何利用其服务与GitHub的API相对接,进而创建一套简单的库浏览器。

第一步:准备工作

我们就以下面这套基础HTML模板为起点:

!DOCTYPE html html head titleGitHub Search/title /head body /body /html

现在将AngularJS脚本添加到该文档的head当中:

script src=""/script

在此之后,我们可以在将这套CCS样式添加到行内或者独立的文件当中:

* { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-family: sans-serif; } body, html { margin: 0; } p { margin: 0; } input { width: 100%; } pre { white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; } div.repo { border-bottom: 1px solid; cursor: pointer; } #search, #repo, #user { float: left; } #search { width: 20%; } #repo { width: 60%; } #user { width: 20%; }

如大家所见,其中不存在任何多余的内容、只保留最基础的布局方案——将搜索栏置于右侧、库信息位于中央、用户库同样置于右侧。我们还需要将对应代码行打包至pre标签当中,此后我们还要利用它显示README文件内容——因为这些内容通常来自GitHub Flavored Markdown、而且其中一部分代码行与用户库列表存在重叠。

当然,大家可以向其中添加更多样式以提升成果的视觉效果——但请注意,本教程中的截图都采取最基本的外观设计。

大家可以未来需要编写的JavaScript代码置于本文档的head当中或者为其建立独立文件,但独立文件仍然需要处于AngularJS脚本之下。

第二步:模块

现在我们可以为自己的应用程序创建一个模块:

var app = angular.module('githubsearch', []);

接下来利用ngApp指令将其添加到body标签当中:

body ng-app="githubsearch"

第三步:控制器

我们还需要为自己的应用程序准备一套控制器。为了简化创建流程,我们将只为应用准备一套控制器,这样我们就不必考虑如何在不同控制器之间进行信息传递了:

app.controller('SearchController', function SearchController($scope) { });

第四步:基础服务

我们需要对自己的GitHub服务进行定义:

app.factory('GitHub', function GitHub($http) { return { }; });

我们将使用app.factory()方法,这样就能保证返回对象附带几个以后将会用到的方法。我们将使用$http服务从GitHub的API中获取数据。

第五步:搜索库

我们服务中的第一项方法负责利用GitHub API对库进行搜索。使用服务非常简单(这项函数能够进入由制造函数返回的对象):

searchRepos: function searchRepos(query, callback) { $http.get('', { params: { q: query } }) .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

$http.get()方法是执行GET请求的一种捷径。第一条参数是我们希望访问的URL。第二条参数则代表一个具备选项的对象。这里我们只需要params对象——它是一个查询参数散列,将被添加到该请求当中(其中q参数属于搜索字符串,大家可以点击此处了解更多相关信息)。

$http.get()会返回一项承诺。我们可以将监听器附加在success()与error()上,并且据此调用回调函数。

第六步:搜索栏

为了使用我们在之前几步中定义完成的函数,我们需要在自己的HTML当中添加搜索栏。相关代码非常简单,如下所示:

div id="search" input ng-model="query" placeholder="search" ng-keyup="$event.keyCode == 13 executeSearch()" div class="repo" ng-repeat="repo in repos" ng-click="openRepo(repo.full_name)" strong{{ repo.full_name }}/strong p{{ repo.description }}/p /div /div

我们使用ngModel指令将该输入栏中的值指向至Scope query变量,并在用户按下回车键后利用ngKeyup调用executeSearch()函数(这样$event.keyCode == 13就会进行比较)。我们无法在AngularJS表达式中使用条件语句,但一条简单的逻辑运算符(AND)足以很好地完成这项任务。

在输入域下面,我们使用ngRepeat来显示搜索结果。我们将显示该库的完整名称与描述(如果需要显示其它不同内容,大家可以点击此处查看GitHub API说明文档中的可用域)。

我们还使用ngClick通过该库的完整名称来调用openRepo()函数,这样我们就能显示与之相关的信息。我们稍后再对该函数进行定义。

第七步:使用搜索功能

现在我们终于可以使用自己创建完成的服务了。首先,将GitHub参数添加至控制器函数(这样该服务就能被注入到AngularJS当中):

app.controller('SearchController', function SearchController($scope) {

现在定义executeSearch()函数:

$scope.executeSearch = function executeSearch() { GitHub.searchRepos($scope.query, function (error, data) { if (!error) { $scope.repos = data.items; } }); }

如大家所见,我们利用来自$scope.query的搜索字符串从当中调用GitHub.searchRepos(),而后在回调中将搜索结果(来自data.items)加入$scope.repos变量。

只要执行以上步骤,我们就能顺利显示出搜索结果。在浏览器中打开我们的HTML文件并尝试进行搜索:

第八步:获取库中的数据

现在我们已经获得了搜索功能,可以显示出库中用户所选定的信息内容。下面我们再创建一条函数,旨在通过自己的服务获取来自库的数据:

getRepo: function getRepo(name, callback) { $http.get(''+ name) .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

被传递至此函数的名称必须为完整名称(结构为:作者名称、斜杠、库名称——例如angular/angular.js),这是因为我们需要将其传递至GitHub

API(点击此处查看更多说明)。

第九步:获取库中的README文件

README文件中的内容并未被包含在我们利用以上函数获取到的数据当中。相反,大家需要利用另一个API进行调用及获取,因此我们需要创建以下函数:

getReadme: function getReadme(name, callback) { $http.get(''+ name +'/readme') .success(function (data) { callback(null, atob(data.content)); }) .error(function (e) { callback(e); }); }

这条函数与之前我们创建完毕的两条基本相同,只不过对URL进行了变更。我们还要利用atob()函数解码README文件的内容,因为它采用base64编码机制。大家可以点击此处查看GitHub

API说明文档中与获取README文件内容相关的信息。

我们之所以没有将这两条请求塞进同一个函数当中,是因为某些库根本不具备 README文件。如果我们将二者强行结合,应用程序可能因此发生故障。

第十步:显示库信息

我们将在另一个元素div当中显示库的完整名称、查看过该库的人数以及README文件:

div id="repo" ng-show="activeRepo" strong{{ activeRepo.full_name }}/strong emWatched by {{ activeRepo.watchers_count }} people./em pre{{ activeRepo.readme }}/pre /div

我们将把该信息保存在控制器Scope内的activeRepo变量当中。只要存在可以显示的数据,ngShow就会将该元素显示出来(如果不存在可以显示的数据,我们将只能看到‘Watched

by people’文本,而且没有任何库被选中)。

第十一步:更新控制器

我们还需要对控制器进行更新,从而保证其切实获取到库数据并将其纳入Scope当中。下面创建我们之前附加至ngClick指令的openRepo()函数:

$scope.openRepo = function openRepo(name) { GitHub.getRepo(name, function (error, data) { if (!error) { $scope.activeRepo = data; GitHub.getReadme(name, function (error, data) { if (!error) { $scope.activeRepo.readme = data; } else { $scope.activeRepo.readme = 'No README found!'; } }); } }); }

如大家所见,我们首先使用GitHub.getRepo()方法、检查错误而后将该数据引入activeRepo变量。接下来,我们获取README文件——如果该文件不存在,我们需要向用户提示该情况。

现在大家可以再次运行自己的应用程序并查看其实际效果:

第十二步:获取用户的库

为了将更多功能引入到我们的应用程序当中,我们将为屏幕右方已被选定库的持有者显示其所有可用库。这要求我们向服务中引入另一个方法:

getUserRepos: function getUser(name, callback) { $http.get(''+ name +'/repos') .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

其内容与此前的几条几乎无甚差别(大家可以点击此处查看更多与此API请求相关的信息)。

第十三步:显示用户的库

这基本上相当于重现HTML中的搜索栏机制,不过我们实际需要显示的是用户名称与user对象中的库,而非输入域或者Scope本身:

div id="user" strong{{ user.login }}/strong div class="repo" ng-repeat="repo in user.repos" ng-click="openRepo(repo.full_name)" strong{{ repo.name }}/strong p{{ repo.description }}/p /div /div

到了这一步,大家应该已经拥有了一套能够切实运作的AngularJS应用程序——它可以根据搜索字符串获取GitHub库。大家可以进一步对其进行迭代,例如向其中添加更多功能或者为其设计完全不同的外观样式。

转载,仅供参考,祝你愉快,满意请采纳。 

AngularJS如何调用外部接口?

第一步:准备工作

 将AngularJS脚本添加到该文档的当中:

在此之后,可以在将这套CCS样式添加到行内或者独立的文件当中:

*{

-webkit-box-sizing:border-box;

-moz-box-sizing:border-box;

box-sizing:border-box;

font-family:sans-serif;

}

body,html{margin:0;}

p{margin:0;}

input{width:100%;}

pre{

white-space:pre-wrap;

white-space:-moz-pre-wrap;

white-space:-pre-wrap;

white-space:-o-pre-wrap;

word-wrap:break-word;

}

div.repo{

border-bottom:1pxsolid;

cursor:pointer;

}

#search,#repo,#user{float:left;}

#search{width:20%;}

#repo{width:60%;}

#user{width:20%;}

如大家所见,其中不存在任何多余的内容、只保留最基础的布局方案——将搜索栏置于右侧、库信息位于中央、用户库同样置于右侧。我们还需要将对应代码行打包至标签当中,此后我们还要利用它显示README文件内容——因为这些内容通常来自GitHub Flavored Markdown、而且其中一部分代码行与用户库列表存在重叠。

当然,大家可以向其中添加更多样式以提升成果的视觉效果——但请注意,本教程中的截图都采取最基本的外观设计。

大家可以未来需要编写的JavaScript代码置于本文档的当中或者为其建立独立文件,但独立文件仍然需要处于AngularJS脚本之下。

第二步:模块

现在我们可以为自己的应用程序创建一个模块:

varapp=angular.module('githubsearch',[]);

接下来利用ngApp指令将其添加到标签当中:

第三步:控制器

我们还需要为自己的应用程序准备一套控制器。为了简化创建流程,我们将只为应用准备一套控制器,这样我们就不必考虑如何在不同控制器之间进行信息传递了:

app.controller('SearchController',functionSearchController($scope){

});

第四步:基础服务

我们需要对自己的GitHub服务进行定义:

app.factory('GitHub',functionGitHub($http){

return{

};

});

我们将使用app.factory()方法,这样就能保证返回对象附带几个以后将会用到的方法。我们将使用$http服务从GitHub的API中获取数据。

第五步:搜索库

我们服务中的第一项方法负责利用GitHub API对库进行搜索。使用服务非常简单(这项函数能够进入由制造函数返回的对象):

searchRepos:functionsearchRepos(query,callback){

$http.get('',{params:{q:query}})

.success(function(data){

callback(null,data);

})

.error(function(e){

callback(e);

});

}

$http.get()方法是执行GET请求的一种捷径。第一条参数是我们希望访问的URL。第二条参数则代表一个具备选项的对象。这里我们只需要params对象——它是一个查询参数散列,将被添加到该请求当中(其中q参数属于搜索字符串,大家可以点击此处了解更多相关信息)。

$http.get()会返回一项承诺。我们可以将监听器附加在success()与error()上,并且据此调用回调函数。

第六步:搜索栏

为了使用我们在之前几步中定义完成的函数,我们需要在自己的HTML当中添加搜索栏。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。