你是否有人认为角度1.3中的形式导致控制器和DOM之间的紧密耦合?这是Angular的反模式。
例如,在为表单提供name ='formExample'属性时,要将其设置为脏或无效的程序,在控制器中我们必须执行$ scope.formExample。$ setDirty()
这是一种不好的做法!
等着听你的想法!
示例:
this.onSaveClicked = function () {
that.saveMessage = that.SAVING_IN_PROGRESS;
//Update project with changes
ProjectsBLL.update($scope.entities.project.Model, function (data) {
$scope.entities.project.Model = data;
$scope.configurationForm.$setPristine();
that.saveMessage = that.SAVING_FINISHED;
}, null)
}
答案 0 :(得分:0)
听起来你不想在控制器中使用以下行
$scope.configurationForm.$setPristine();
要实现这一目标,一种方法是:
更改ProjectsBLL.update
以返回承诺而不是接受回调(如何执行此操作可能超出了此问题的范围)。然后还从控制器中的函数返回then
的派生承诺:
this.onSaveClicked = function () {
that.saveMessage = that.SAVING_IN_PROGRESS;
//Update project with changes
return ProjectsBLL.update($scope.entities.project.Model).then(function (data) {
$scope.entities.project.Model = data;
that.saveMessage = that.SAVING_FINISHED;
});
}
然后使用自定义指令而不是ng-click
来调用save函数。可能有几种方法可以做到这一点,但一种方法是添加一个将函数作为属性的方法:
<button type="button" my-submit="onSaveClicked()">Save</button>
添加了一个手动click
侦听器,在单击时调用传递的函数,并在其返回的承诺解析后,在$setPristine()
表单上调用require
:
app.directive('mySubmit', function($parse) {
return {
require: '^form',
link: function(scope, element, attrs, formController) {
var callback = $parse(attrs.mySubmit);
element.on('click', function() {
callback(scope, {}).then(function() {
formController.$setPristine();
});
});
}
};
});
只需使用$timeout
来模拟对$http
的来电,就可以在http://plnkr.co/edit/IdcfQ4N9MhDKdvyorzeO?p=preview