【问题标题】:Submitting the form after changing value in Angular Directive submits old value在 Angular 指令中更改值后提交表单提交旧值
【发布时间】:2014-07-29 13:00:57
【问题描述】:

http://jsfiddle.net/p8RNJ/3/

当我按下“提交”按钮时,控制器中的fooController 等于'A',因此barController 获得分配值'A',这在UI 中得到确认:

bar in controller: A

按下“设置值”按钮后,fooController 通过绑定值“B”从指令更新,在 UI 中确认:

foo in controller: B

但是,当我按下“提交”按钮后,控制器中的fooController 仍然具有旧值“A”,因此$scope.barController 再次被分配了一个值“A”:

bar in controller: A

如何确保在第二次提交时fooController 具有正确的“B”值,并且barController 也被分配了“B”值?

HTML:

<div ng-app="app" ng-controller="Controller">
<script type="text/ng-template" id="directive-template.html">
    foo in directive: {{fooDirective}}<br/>
    <button ng-click="setValue()">set value</button>
</script>

<form data-ng-submit="getModel()">
    <div ng-controller="Controller">
        <button type="submit">submit</button><br/>
        foo in controller: {{fooController}}<br/>
        bar in controller: {{barController}}<br/>
        <my-customer model="fooController"></my-customer>
    </div>
</form>
</div>

还有 JS:

angular.module('app', [])
.controller('Controller', ['$scope', function($scope) {
    $scope.fooController = 'A';
    $scope.getModel = function() {
        $scope.barController = $scope.fooController;
    }
}])

.directive('myCustomer', function() {
    return {
        restrict: 'E',
        scope: {
            fooDirective: '=model'
        },
        controller: function ($scope) {
            $scope.setValue = function() {
                $scope.fooDirective = 'B';
            };
        },
        templateUrl: 'directive-template.html'
    };
});

【问题讨论】:

  • 这个问题很难理解,因为所有的 foos、bars、b's 和 a's。

标签: forms angularjs angularjs-directive


【解决方案1】:

不要使用原始数据类型(数字、字符串、布尔值),因为继承不能双向起作用,它只能从父 $scope 到子 $scope 起作用。如果您希望它以两种方式工作,用户对象或数组(这就是 Angular 社区实际推荐的方式)。

$scope.barController = "aaaa";

应该是:

$scope.modelState.barController = "aaa";

这样,如果您从子范围更改它,它也会在父范围中更新。

【讨论】:

    【解决方案2】:

    您需要将指令更改包装在 $scope.apply 中

      $scope.apply(function(){
            $scope.setValue = function() {
                $scope.fooDirective = 'B';
            };
       }
    

    【讨论】:

    • 我认为这里不需要 $apply ,因为所有操作都在“角度范围”内。
    • 仅当指令使用一些不属于 Angular 周期的“第 3 方”API/库时。我从来没有遇到过从指令更新 $scope 的问题。
    • 我在由 scope.apply 解决的指令中遇到了完全相同的问题,如果在这种情况下不相关,请抱歉。这是为我学习:)
    • 我也不是专家,所以你很有可能是对的 :)