我正在尝试创建一个具有“正在加载”状态的可重用按钮指令。也就是说,当单击它时,它会禁用自身并显示一个内联图像以表示加载,然后在完成时将其删除。我通过在 click 方法中设置范围变量并取消设置它来完成此操作,这会更改按钮的状态。
我希望它在单击时调用的方法位于父范围内,并且我还希望它挂钩到父范围的验证中,因此当父表单无效时它会自行禁用。这些是我难以开始工作的部分——我知道我的问题与范围有关,但我被困住了。
<loading-button class="login" data-ng-click="login()" text="Login" toggle="loaded"></loading-button>
我希望做类似下面的事情,但是如何绑定在指令实例上声明的 click 方法以从指令中实际调用?或者,这是不好的做法吗?这目前不起作用。
angular.module("App.directives").directive("loadingButton", function () {
return {
restrict: "E",
replace: true,
transclude: true,
template: '<button data-ng-click="{{ngClick}}">{{text}}<img class="loading" src="images/ButtonLoader.gif" alt=""></button>',
scope: {
"toggle": "=",
"text": "=",
"ng-disabled": "=",
"disabled": "=",
"ngClick": "&"
},
link: function(scope, element, attributes) {
scope.text = attributes.text;
var expression = attributes.toggle;
scope.$watch(expression, function(newValue, oldValue) {
if(newValue === oldValue) {
return;
}
if(newValue) {
element.removeAttr("disabled");
element.find("img.loading").hide();
}
else {
element.attr("disabled", "disabled");
element.find("img.loading").show();
}
});
}
};
});
在父作用域中像这样使用:
$scope.login = function () {
$scope.loaded = false; // Disable button and show it loading
// Do login stuff
$scope.loaded = true; // Enable button and hide it loading
}
编辑:
这是一个小提琴