在Angular Directive中更改值后提交表单会提交旧值

时间:2014-07-29 13:00:58

标签: forms angularjs angularjs-directive

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'
    };
});

2 个答案:

答案 0 :(得分:0)

您需要在$ scope.apply

中包装您的指令更改
  $scope.apply(function(){
        $scope.setValue = function() {
            $scope.fooDirective = 'B';
        };
   }

答案 1 :(得分:0)

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

$scope.barController = "aaaa";

应该是:

$scope.modelState.barController = "aaa";

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