设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

angular-smarty:一个AngularJS的自动完成UI实现

2014-6-19 10:18| 发布者: joejoe0332| 查看: 5709| 评论: 0|原作者: 0x0bject, Garfielt, 中奖啦|来自: oschina

摘要: 我们最近为我们的论坛增加了一个自动完成功能(称为Smarty),在要求专业人员简介的主页上。这是一个超有用的功能,因为它有助于我们将用户导航到他们真正想去的地方。它很有意思,也是用AngularJS构建的! ... ...


&: 本地与父作用域之间的单向数据绑定

控制器:

$scope.setSelected = function(newValue) {...};

HTML:

SmartyInput指令符:

scope: {select: "&", ... }...scope.select({"x": parseInt(scope.index) + 1});

  SmartyInput指令符将控制器作用域中的setSelected()函数绑定到指令作用域中的select()函数上,这样可以使指令符在不改变setSelected()函数的情况下使用它。


@:将计算表达式绑定到本地作用域

控制器:

$scope.prefix = ""

HTML:

SmartySuggestions指令符:

scope: {prefix: "@", ...}


  通过SmartySuggestions指令符,可在建议菜单中显示prefix的值,所以此处使用计算表达式{{prefix}}。这种绑定方式在多项复杂表达式中更常用,比如:next-index=“{{selected + 1}}”。


  Promises

  promise是用于执行异步任务的技术。一个promise具有一个名为then()的方法,该方法在promise执行时会作为被执行的的回调函数的一个参数。当异步任务完成,promise会将一段消息传给那个回调函数。当用户输入的prefix前缀中检测到更改,则promise就会出现在Smarty的代码中,然后我们会用$http执行一个GET请求,用来更新显示给用户建议的列表。


  这个过程看起来是这样的:


  当$scope.$watch在$scope.prefix(请注意,此处绑定到用户UI输入界面)的值中注册了一个更改,此时会调用getSmartySuggesction()。


1var promise = smartySuggestor.getSmartySuggestions($scope.prefix);promise.then(function(data) {
2    $scope.suggestions = data;});


  在getSmartySuggesctions()中,$http.get会返回一个参与服务器响应的promise。


01function getSmartySuggestions(prefix) {
02    requestParams["query"] = escape(prefix.toLowerCase());
03    var promise = $http.get(requestUrl(),
04        {
05            params: requestParams,
06            cache: true
07        }
08    ).then(function(response) {
09        return response.data.slice(0, 5).map(function(item) {
10            return item.Name;
11        });
12    });
13    return promise;}


  服务器响应看起来是这样的:


[{"ID":13,"Name":"Portrait Photography"},{"ID":24,"Name":"Commercial Photography"},{"ID":21,"Name":"Pet Photography"},{"ID":16,"Name":"Event Photography"},{"ID":26,"Name":"Headshot Photography"}]


  接下来,我们会调用存在于promise中的then()方法,在解析服务器响应回调中进行传递。then()方法返回一个新的promise,它处理了解析过的响应,并存储到通过getSmartySuggestions()返回的promise中。


  解析过的响应看起来是这样的:[“Portrait Photography”, “Commercial Photography”, “Pet Photography”, “Event Photography”, “Headshot Photography”]。


  最终,回到$scope.$watch,我们调用promise中的then()方法,为变量suggestions分配这些解析过的响应。


1var promise = smartySuggestor.getSmartySuggestions($scope.prefix);
2promise.then(function(data) {
3    $scope.suggestions = data;
4});


  继续前进


  再后来,我们决定在主页上再增加一个额外表单,当你将页面滚动过第一个请求表单时以一个粘性滑进视图的形式。将Smarty添加到这个请求表单很容易,我们只需要在这个表单的HTML中包括一个additional的Smarty控制器。


smart sticky header


  当键入“foto”时的结果正如你在上面的截图中所看到的,Smarty看起来很很聪明吧!这主页归功于幕后工作的Hercule,Smarty与之通信并生成建议列表。另外一位工程师,Alex,正在写一篇关于Hercule背后逻辑的文章,他实验过用Go来写它。


关于 angular-smarty


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部