&: 本地与父作用域之间的单向数据绑定控制器: $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()。
1 | var promise = smartySuggestor.getSmartySuggestions($scope.prefix);promise.then( function (data) { |
2 | $scope.suggestions = data;}); |
在getSmartySuggesctions()中,$http.get会返回一个参与服务器响应的promise。
01 | function getSmartySuggestions(prefix) { |
02 | requestParams[ "query" ] = escape(prefix.toLowerCase()); |
03 | var promise = $http.get(requestUrl(), |
05 | params: requestParams, |
08 | ).then( function (response) { |
09 | return response.data.slice(0, 5).map( function (item) { |
服务器响应看起来是这样的:
[{"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分配这些解析过的响应。
1 | var promise = smartySuggestor.getSmartySuggestions($scope.prefix); |
2 | promise.then( function (data) { |
3 | $scope.suggestions = data; |
继续前进
再后来,我们决定在主页上再增加一个额外表单,当你将页面滚动过第一个请求表单时以一个粘性滑进视图的形式。将Smarty添加到这个请求表单很容易,我们只需要在这个表单的HTML中包括一个additional的Smarty控制器。
 当键入“foto”时的结果正如你在上面的截图中所看到的,Smarty看起来很很聪明吧!这主页归功于幕后工作的Hercule,Smarty与之通信并生成建议列表。另外一位工程师,Alex,正在写一篇关于Hercule背后逻辑的文章,他实验过用Go来写它。
关于 angular-smarty |