更改分配给该指令回调的指令的 ngModel

Change ngModel that was assigned to a directive on a callback from that directive

所以我有我的 SPA 应用程序。

Here on plunker我不会粘贴所有代码,因为它太多了)你可以看到它的部分娱乐(结构和层级相同).

问题从哪里开始... 根据设计文档,在其中一页上,我们有一个 link 到政策文档和一个供客户检查的复选框,他确实阅读了它。

设计:

  1. 复选框始终处于启用状态,因此客户端始终可以尝试选中它
  2. 客户端打开策略文档后(点击 link),当客户端点击它时,复选框应该会被选中
  3. 如果客户尚未打开(单击)政策文档 link 并尝试选中该复选框,则在他释放鼠标时 return 不会选中该复选框,并且应显示相关错误消息

更新:

感谢 RafaeelloKobi Cohen 我可以把代码简化很多,摆脱手表和无用的东西...

现在这就是我所拥有的...

这里是指令控制器:

app.directive('checkBox', [function() {
  var directive = {
    scope: {}, 
    restrict: 'E', 
    controller: function() {},
    controllerAs: 'checkBoxCtrl',
    bindToController: {
      ngModel: '=',
      callback: '&callback',
      text: '@' 
    },
    templateUrl: 'check-box.directive.view.html',
    link: function() {},
    require: 'ngModel'
  };
  return directive;
}]);

和指令html:

<div class="checkboxContainer">
    <label class="btn btn-checkbox" ng-class="{'active': checkBoxCtrl.ngModel}" 
                                    ng-click="checkBoxCtrl.ngModel = !checkBoxCtrl.ngModel; checkBoxCtrl.callback()">
        <span class="checkboxPic"></span> 
        <span class="checkboxText">{{checkBoxCtrl.text}}</span> 
    </label>
</div> 

这是视图 html:

<check-box text="check me"  ng-model="viewCtrl.checkBoxResult" 
                            callback="viewCtrl.callback()"></check-box>
<br/>
<a ng-click="viewCtrl.openGoogleClicked = true" href="//www.google.com" target="_blank">Open Google</a>
 
<hr> 

<h3>Status</h3>  
check box result: {{viewCtrl.checkBoxResult}}    
<br/>
google opened: {{viewCtrl.openGoogleClicked}}
<br/>
callback function called: {{viewCtrl.callbackCalled}}

这是视图控制器:

angular.module('app').controller('viewController', ['$scope', function($scope) {
  this.checkBoxResult;
  this.openGoogleClicked;
  this.callbackCalled;
 
  this.callback = function callback() {  
    this.callbackCalled = true;
    if (this.checkBoxResult && angular.isUndefined(this.openGoogleClicked)) {
      this.checkBoxResult = false;
    } 
  };
}]);

question/problem/opened 问题: Callback 在视图控制器的 ngModel 被改变之前被调用。因此,如果我在 callback 内将其更改回 false 或不更改,它并没有真正计量,因为在 callback 之后 directive (据我了解)仍然绑定它的新价值。

有治愈方法吗?

根据你想做的事情,你可以像这里那样做 (here) 或者你可以编写具有确定有效性功能的验证器 (here is example of writing your own validator) 然后你的表单和复选框将有 invalid 在我看来比不允许用户检查复选框更好