Angular.js绑定模型到指令

时间:2013-09-04 22:26:23

标签: angularjs angularjs-directive

我正在尝试整理一个Angular指令,它将取代添加

ng-disabled="!canSave(schoolSetup)"

在表单按钮元素上,canSave是在控制器中定义的函数,如下所示,其中参数是表单的名称。

$scope.canSave = function(form) {
    return form.$dirty && form.$valid;
};

理想情况下,我喜欢提交按钮上的指令看起来像这样。

can-save="schoolSetup"

字符串是表单的名称。

那么......你会怎么做?这是我能得到的......

angular.module('MyApp')
    .directive('canSave', function () {
        return function (scope, element, attrs) {

            var form = scope.$eval(attrs.canSave);

            function canSave()
            {
                return form.$dirty && form.$valid;;
            }

            attrs.$set('disabled', !canSave());
        }

    });

但是这显然不能正确绑定到表单模型,只能用于初始化。无论如何都要从这个指令中绑定ng-disabled指令,或者这也是错误的方法?

2 个答案:

答案 0 :(得分:3)

angular.module('MyApp')
    .directive('canSave', function () {
        return function (scope, element, attrs) {
            var form = scope.$eval(attrs.canSave);

            scope.$watch(function() {
                return form.$dirty && form.$valid;
            }, function(value) {
                value = !!value;
                attrs.$set('disabled', !value);
            });
        }
    });

Plunker:http://plnkr.co/edit/0SyK8M

答案 1 :(得分:2)

您可以将函数调用传递给指令,如此

function Ctrl($scope) {
    $scope.canSave = function () {
        return form.$dirty && form.$valid;
    };
}

app.directive('canSave', function () {
    return {
        scope: {
            canSave: '&'
        },
        link: function (scope, element, attrs) {
            attrs.$set('disabled', !scope.canSave());
        }
    }
});

这是模板

<div ng-app="myApp" ng-controller="Ctrl">
    <div can-save="canSave()">test</div>
</div>

您可以看到从指令调用该函数。 Demo