0

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

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 ??? */
        }
    };
});

索引.html

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

1 回答 1

2

'&'如果您像这样传递,则将您的函数引用传递给指令,updateFromController()否则使用'='for 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 给出的发布/订阅者模型,如下所示

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')
       }); 

    }



}

})
于 2016-09-06T11:30:38.477 回答