问题

在使用 typeahead 的时候,有这样一个需求,当用户选中其中一项的之后,将项目对应的 id 保存到另外一个变量中,以后在提交表单的时候,将这个 id 发送到服务器中。

但是,在 typeahead 中对于元素的操作,angularjs 没有感知到,导致不能获取最新的数据。

typeahead 中选择数据之后的事件 itemSelected

在 typeahead 中,我们可以定义一个 itemSelected 的事件处理函数,在选中一个项目之后, typeahead 会触发这个事件,我们在这个事件中可以获取当前选中的元素,对应的值,已经显示的提示文本。

这个函数的使用方式如下:

itemSelected: function (item, val, text) {
console.info(val);
}

集成到页面中,我们可以如下配置 typeahead 的配置参数。

var option = {
ajax: {
url: '@Url.Action("AjaxService")',
timeout: 300,
method: "post",
triggerLength: 3,
preDispatch: function (query) {
return { type: type, query: query };
},
preProcess: function (data) {
return data;
}
},
display: "name",
val: "id",
itemSelected: function (item, val, text) {
console.info(item);
}
};
$("#tbxName").typeahead(option);

但是,在使用 angularjs 的时候,会带来一个问题,如果我们直接将这个 id 赋予某个元素,比如说输入框的话,angularjs 是不能检测到这个元素值的变化的,angularjs 通过监测元素的获取焦点,失去焦点,change 等事件来感知输入元素的变化,在通过代码直接赋值的时候,会没有这些事件的触发。

原理

我们可以通过 angularjs 的自定义指令将 typeahead 封装一下,在 itemSelected 事件触发的时候,调用 angularjs 的 $apply 发出通知,这样 angularjs 自然就可以感知到数据的变化了。

实现

为了便于已经熟悉 typeahead 的朋友,继续使用原来的方式进行配置,我们不修改配置方式。

指令的定义如下:

// 自定义指令
app.directive("typeahead", function () {
var option = {
restrict: "A",
require: "?ngModel",
scope: {
option: "=typeahead"
},
link: function (scope, element, attrs, ngModel) { // typeahead 的配置参数
var option = scope.option; // 将原来的 itemSelected 替换为 angularjs 的 itemSelected 函数
// 在用户选择了选项之后,通过 angularjs 执行
var itemSelected = option.itemSelected;
option.itemSelected = function (item, val, text) {
scope.$apply(function () {
itemSelected(item, val, text);
})
}; element.typeahead(option);
}
};
return option;
});

scope 是自定义一个作用域,=typeahead 是将 typeahead 属性的值取过来,剩下的处理就比较简单了,我们将原来的 itemSelected 事件截获过来,通过 scope.$apply 进行处理,这样 angularjs 自然就可以获取数据的变化了。

元素的定义如下,增加一个名为 typeahead 的 Attribute, 值就是配置参数对象,定义在 angularjs 的模型对象上。

<input typeahead ="typeaheadOption" ng-model="petName" type="text" />

下面是对应的脚本。

// 控制器
app.controller("myController", function ($scope) {
// 额外附加的参数
$scope.type = "java"; // 标准的使用方式
$scope.petName = "Cat";
$scope.petId = ""; // 使用标准的 typeahead 配置参数, 在元素上使用 typeahead Attribute 连接
$scope.typeaheadOption
= {
ajax: {
url: '@Url.Action("AjaxService")',
timeout: 300,
method: "post",
triggerLength: 3,
preDispatch: function (query) {
return { type: $scope.type, query: query };
},
preProcess: function (data) {
return data;
}
},
display: "name",
val: "id",
itemSelected: function (item, val, text) {
$scope.petId = val;
}
}; });

总结

使用 angularjs 的自定义指令,我们可以很容易地将 angularjs 之外的事件处理封装到 angularjs 之中。

在 angularjs 中集成 bootstrap typeahead的更多相关文章

  1. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  2. 如何在 ASP.NET MVC 中集成 AngularJS(1)

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

  3. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  4. 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

    在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...

  5. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能

    在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...

  6. AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能

    在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...

  7. UIBootatrap:是由AngularJS UI团队编写的纯AngularJS实现的Bootstrap组件

    本文为翻译文档.原文是https://angular-ui.github.io/bootstrap/(需要FQ). 准备工作: 依赖关系:这个库中包含一组基于Bootstrap组件和CSS的原生Ang ...

  8. MVC 中集成 AngularJS1

    在 ASP.NET MVC 中集成 AngularJS(1)   介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 R ...

  9. AngularJS中的控制器和作用域

    欢迎大家指导与讨论 : ) 一. 作用域的事件传播 一 . 1 修改的传播   关于作用域最重要的一点是修改会通过事件传播下去,自动更新所以依赖的数据值,即使是通过行为产生的.简而言之,就是即时您只修 ...

随机推荐

  1. VBA 打开一个string指定的文件

    Open csvFileName For Input As #1 Dim lineChanger as String lineChanger = Chr(13) fileData = Split(St ...

  2. Android启动画面实现

    每个Android应用程序启动之后都会出现一个Splash启动界面,显示产品LOGO.公司LOGO或者开发者信息.如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥 ...

  3. android外包公司——最新案例铁血军事手机客户端(IOS & Android)

    <铁血军事>Android手机客户端由铁血网开发和运营,为网友提供铁血论坛和铁血读书两大产品.使用Android手机客户端,您不仅可以阅读到最新军事资讯,随时参与精彩话题讨论,还可以在线阅 ...

  4. Linux下做软RAID

    1.查看有多少块硬盘可用#fdisk -l嗯,一般而言,留下系统盘不动,其它的盘如果大小相同的话,统统合起来做一个raid. 2.决定做什么类型的raid.raid-0.raid-1.raid-5?如 ...

  5. 战胜忧虑<3>——学会接受不可避免的事实。

    学会接受不可避免的事实. 对必然的事情愉快地承受,就像杨柳承受风雨,水接受一切容器,我们也要承受一切事实. 故事: 在美国庆祝陆军在北非获胜的那一天,我接到国防部送来的一封电报,我的侄儿——我最爱的一 ...

  6. eclipse调试总结(转)

    Debug视图 认识debug视图,红色部分框为线程堆栈视图,黄色部分框为表达式.断点.变量视图,蓝色部分为代码视图.  线程堆栈视图 分别介绍一下这几个按钮的含义: 1.表示当前实现继续运行直到下一 ...

  7. MySql语句大全:创建、授权、查询、修改等

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.用户创建.权限.删除 1.连接MySQL操作 连接:mysql -h 主机地址 -u 用户 ...

  8. Linux客户端、服务器、窗口管理器的关系

    嵌入式linux中文站发现很多LINUX初学者在学习linux图形方面的知识时会遇到一些概念,如:X.X11.Xfree86.WM.KDE.GNOME.QT.QT/E.Qtopia.DirectFB. ...

  9. PO_PO系列 - 请购单系统分析(案例)

    2014-07-01 Created By BaoXinjian

  10. CF 486D vailid set 树形DP

    As you know, an undirected connected graph with n nodes and n - 1 edges is called a tree. You are gi ...