角形1.3紧密耦合

时间:2015-03-11 06:17:19

标签: angularjs forms angularjs-scope

你是否有人认为角度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)
    }

1 个答案:

答案 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

看到此版本