将指令操作绑定到父控制器AngularJS

时间:2016-09-06 11:13:50

标签: angularjs data-binding isolate-scope

我有一个配置文件更新指令,我想从父作用域触发更新操作。 这看起来像我的代码:

  

main.js

angular.module('app')
.directive('profile',{
    scope: {
        updateFromDirective: "="
    },
    template: '<form><input ng-model="name"/></form>',
    controller: function(){
        this.updateFromDirective = function(){
            /* update here */
        };
    }
})
.controller('Ctrl', function(){
    this.updateFromController = function(){
        if(condition){
            /* how do I call updateFromDirective here ??? */
        }
    };
});
  

的index.html

<div ng-controller="Ctrl">
    <profile updateFromDirective="updateFromController"></profile>
    <button ng-click="updateFromController()">Update</button>
</div>

1 个答案:

答案 0 :(得分:2)

如果您正在使用'&'传递您的函数参考指令updateFromController(),请'='使用updateFromController(两者都可以)

现在就在你的情况下

注意: 我假设你不想使用$ scope,因为你在控制器中有你的功能

要从指令调用控制器函数,您需要将其作为回调传递,并可以调用该回调,如下所示

angular.module('app',[])
.controller('Ctrl', function(){
    this.updateFromController = function(){
         alert('In Contrller')
    };
}).directive('profile',function(){
   return{
    scope:{
      controllercallback: "&"
    },
    template:'<input ng-model="name"/><br/><button ng-click="ctrl.updateFromDirective()">Update</button>',
    controller:function(){
      this.updateFromDirective=function(){
        alert('In Directive')
        this.controllercallback();
      }
    },
    bindToController: true,
    controllerAs:'ctrl'
  }

})

你的html应该如下所示

 <div ng-controller="Ctrl as vm">
 <profile controllercallback="vm.updateFromController()"></profile>

但是这里你的按钮在指令本身。

如果您不希望您的按钮成为指令的一部分,您可以使用由角度给出的发布/订阅者模型,如下所示

angular.module('app',[])
.controller('Ctrl', function($scope){
    this.updateFromController = function(){
         $scope.broadcast('calldirective');
    };
}).directive('profile',function(){
   return{
    template:'<input ng-model="name"/>',
    controller:function($scope){
       $scope.$on('calldirective', function() {
         alert('In Directive')
       }); 

    }



}

})