数据传递流程和之上的例子差不多,唯一要注意的是参数传递时,{name: innerName}前者是形参,后者是实参。多个参数时,参数顺序不重要,形参一一对应。
4.父控制器调用directive的函数。这个是前段时间遇到的难点,情况较其他复杂一些。应用场合也很普遍,比如初始化,重置等。
<body ng-app="myApp" ng-controller="myCtrl"> <button ng-click="click()">重置</button> <test-directive action="action"></test-directive> <script> angular.module("myApp",[]) .controller("myCtrl",function($scope){ $scope.action = {}; $scope.click = function () { $scope.action.reset(); } }) .directive("testDirective",function(){ return { restrict:"E", scope: { action: "=" }, template:"<input type='text' ng-model='name' placeholder='白衣如花'>", controller: function ($scope) { $scope.action.reset = function () { $scope.name = "白衣如花" } } } }); </script> </body>
又一次用到了=,利用了js中函数也是属性的原理。似乎,理解了=的双向绑定,就很容易调用directive内部函数了。但是初始化呢?
首先想到的是类似的=来引用传递:
<body ng-app="myApp" ng-controller="myCtrl"> <test-directive action="action"></test-directive> <script> angular.module("myApp",[]) .controller("myCtrl",function($scope){ $scope.action = {}; $scope.action.init(); }) .directive("testDirective",function(){ return { restrict:"E", scope: { action: "=" }, template:"<input type='text' ng-model='name' placeholder='白衣如花'>", controller: function ($scope) { $scope.action.init = function () { $scope.name = "白衣如花" } } } }); </script> </body>
但是运行却发现,错误显示$scope.action.init is not a function,看提示应该是运行到第7行的时候,$scope.action.init函数还未定义。怎么办呢?把directive提到controller之前试试?一样是错误。
嗯,可以不用函数,直接在directive的controller中执行$scope.name = "白衣如花",似乎很完美,但如果是有参数的初始化呢?事实上js分离后,我遇到的问题是根据http请求的返回结果来初始化directive,由于
网络快慢不一定,导致控件初始化时不一定有http请求的返回(没有有效的初始化参数),也不能保证http请求返回后directive已经初始化(不能用=来进行函数调用)。
需求很明了了,如果能监控参数变化,再执行初始化,此时能保证directive已经加载,而且有有效的参数。正好angularjs提供了$watch。代码如下:
<body ng-app="myApp" ng-controller="myCtrl"> <test-directive action="action"></test-directive> <script> angular.module("myApp",[]) .controller("myCtrl",function($scope){ $scope.action = {name: "白衣如花"}; }) .directive("testDirective",function(){ return { restrict:"E", scope: { action: "=" }, template:"<input type='text' ng-model='name' placeholder='白衣如花'>", link: function (scope, elem, attrs) { scope.$watch(attrs.action, function (value) { scope.action.init(); }) }, controller: function ($scope) { $scope.action.init = function () { $scope.name = $scope.action.name } } } }); </script> </body>
这是我对于directive数据交互的粗浅理解。想要更详细了解,请参看官方文档:https://docs.angularjs.org/guide/directive