AngularJS:如何将参数/函数传递给指令?

时间:2012-12-05 14:55:07

标签: javascript html5 controller scope angularjs

看看this Fiddle,我需要改变什么,使用我在HTML中定义的参数来评估模板中的表达式? SAVE按钮应该调用控制器的blabla() - 函数,因为我通过了它?

var myApp = angular.module('MyApp',[])
myApp.directive('editkeyvalue', function() {
    return {
        restrict: 'E',
        replace: true,
        scope: {
            accept: "expression"
        },
        template : '<div><label class="control-label">{{key}}</label>' +
        '<label class="control-label">{{key}}</label>' +
          '<input type="text" ng-model="value" />'+
        '<button type="button" x-ng-click="cancel()">CANCEL</button>' +
        '<button type="submit" x-ng-click="save()">SAVE</button></div>',

      controller: function($scope, $element, $attrs, $location) {
        $scope.save= function() {
          $scope.accept();
        };
      }
    }
});

我真的没有看透。谢谢你的帮助!

3 个答案:

答案 0 :(得分:46)

您可以像Roy建议的那样设置与property: '='的双向数据绑定。因此,如果您希望将keyvalue绑定到本地范围,则可以执行

scope: {
    key: '=',
    value: '='
},

由于您传递了这些值,因此您可以在指令的控制器中访问它们。但是如果你想在父范​​围的上下文中运行一个函数,这似乎是你想用accept属性做的事情,那么你需要像这样告诉角度

scope: {
    accept: "&"
}

现在,您可以通过save方法调用通过accept

传递的函数
controller: function($scope, $element, $attrs, $location) {
    $scope.save= function() {      
        $scope.accept()
    };
}

这是jsfiddle

答案 1 :(得分:15)

scope: {
    accept: "&"
}

对函数名称使用小写字母,否则不起作用。

答案 2 :(得分:1)

快速说明你不需要包装功能保存。只需在模板中调用它:

'<button type="submit" x-ng-click="accept()">SAVE</button></div>',

转换函数调用并按预期传递参数。

这简化了代码并使其更易于阅读。