angular自定义指令作用域&--传递引用
独立作用域和函数参数 通过使用本地作用域属性,你可以传递一个外部的函数参数(如定义在控制器$scope中的函数)到指令。这些使用&就可以完成。下面是一个例子,定义一个叫做add的本地作用域属性用来保存传入函数的引用: angular.module('directivesModule') // ... // 添加新的`customer`到指令作用域 指令的消费者可以通过定义一个add属性的方式传递一个外部的函数到指令。如下: <div isolated-scope-with-controller datasource="customers" add="addCustomer()"></div> 在这个例子中,函数addCustomer()将会在用户点击指令中创建的按钮时被调用。没有参数传入,所以这里是一个相对简单的操作。 如何向addCustomer()函数中传递参数呢?例如,假设addCustomer()函数显示在下面的控制器下并且当函数被调用时需要传递一个name参数到指令中: app.controller('CustomersController',['$scope',function ($scope) { $scope.addCustomer = function (name) { $scope.changeData = function () { 从指令内传递一个参数到外部函数在你了解它的工作方式后会显得特别简单,下面是一般开发者起初可能会尝试的写法: // 添加新的`customer` 需要注意的是指令的控制器通过调用$scope.add(name)来尝试调用外部函数并传递一个参数过去。这样可以工作吗?实际上在外部函数中输出这个参数得到的却是undefined,这可能让你抓破脑袋都想不通为什么。那么接下来我们该做什么呢? 选择1:使用对象字面量 一种方法是传递一个对象字面量。下面是演示如何把name传递到外部函数中的例子: // Add new customer to directive scope 需要注意的是$scope.add()方法调用时现在传递了一个对象字面量作为参数。很不幸,这样仍然不能工作!什么原因呢?传递给$scope.add()的对象字面量中定义的name属性在分配给指令时同样也需要在外部函数中被定义。非常重要的一点是,在视图中写的参数名必须要与对象字面量中的名字匹配。下面是一个例子: <div isolated-scope-with-controller datasource="customers" add="addCustomer(name)"></div> 可以看到在视图中使用指令时,addCustomer()方法添加了个参数name。这个name必须要与指令中调用$scope.add()时传入的对象字面量中的name相匹配。如此一来指令就能正确工作了。 选择2:存储一个函数引用并调用它 上面那种方式的问题在于在使用指令时必须要给函数传递参数而且参数名必须在指令内以对象字面量的形式被定义。如果任何一点不匹配将无法工作。虽然这种方法可以完成需求,但仍然有很多问题。例如如果指令没有完善的使用说明文档就很难知道指令中需要传递的参数名究竟是什么,这时就不得不去翻指令源码查看参数内容了。 另一种可行的方法是在指令上定义一个函数但在函数名后面不加圆括号,如下: <div isolated-scope-with-controller-passing-parameter2 datasource="customers" add="addCustomer"></div> 为了传递参数到外部的addCustomer函数你需要在指令中做以下事情。把$scope.add()(name)代码放到可被addCustomer调用的方法下面: angular.module('directivesModule') $scope.addCustomer = function () { $scope.add()(name); ... 在指令中输出$scope.add()将会得到以下内容(正好验证上面所说):
&背后的运行机制 如果你对&的运行机制感兴趣,当&本地作用域属性被调用(例如上面例子中的a dd本地作用域属性),下面的代码将会执行: 上面的attrName变量相当于前面例子中指令本地作用域属性中的add。调用$pares返回的parentGet函数 如下: for (var i = 0; i < argsFn.length; i++) { ensureSafeObject(context,parser.text); // IE stupidity! (IE doesn't have apply for some native functions) return ensureSafeObject(v,parser.text); 处理代码映射对象字面量属性到外部函数参数并调用函数。 虽然没有必要一定去理解如何使用&本地作用域属性,但是去深入发掘AngularJS在背后做了一些什么总是一件有趣的事情。 结尾 从上面可以看到&的传参过程还是有点困难的。然而一旦学会了如何使用,整个过程其实并不算太难用。 转自:http://www.cnblogs.com/Hquestion/p/angular-directive.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 高性能kv存储之Redis、Redis Cluster、Pika:如何应对4000亿
- ubuntu – 设备映射到docker中的容器缺少信息
- Angular Reactive Forms -- Model-Driven Forms响应式表单
- Bootstrap 面板(Panels)
- BootStrap入门教程 (四)
- 可以将Scala用于编写GWT应用程序吗?
- RESTClient调试RESTful Webservice
- Azure Messaging-ServiceBus Messaging消息队列技术系列6-消
- macos-Pycharm docker远程python解释器
- angular – 如何刷新路径的已解析数据