我在将输入框绑定到Angular中的控制器时遇到一些麻烦。我已经按照各种教程中的说明进行了设置,但是当我访问该属性或使用AngularJS Batarang检查范围时,我看到该模型永远不会更新。

当我提交表单时,$scope.licenceKey始终为空!

<div ng-app="licenceApp" ng-controller="licenceController">
    <form name="licenceForm" ng-submit="applyKey()" novalidate>
        <span ng-if="!Applying">
            <input type="text" ng-model="licenceKey" ng-disabled="Applying" ng-model-options="{ debounce : { 'default' : 150 } }" username-available-validator required />
            ...


JS:

angular.module('licenceApp.controllers', [])
    .controller('licenceController', function ($scope, licenceAPIservice, $filter) {
        $scope.licenceKey = "";
        $scope.Applying = false;
        ...
        $scope.applyKey = function () {
            $scope.Applying = true;

            // $scope.licenceKey is always empty here!!
            licenceAPIservice.applyKey($scope.licenceKey).then(function (data) {
                console.log(data);

                // Update model once we have applied the key
                $scope.update();
            }, function () {
                $scope.Applying = false;
            });
        };


和username指令(我需要更改名称以反映其功能,但还没有)

angular.module('licenceApp.directives', [])
    .directive('usernameAvailableValidator', function ($http, $q, licenceAPIservice) {
        return {
            require: 'ngModel',
            link: function ($scope, element, attrs, ngModel) {
                ngModel.$asyncValidators.usernameAvailable = function (username) {
                    var deferred = $q.defer();

                    licenceAPIservice.validateKey(username).then(function (data) {
                        if (data.data) {
                            deferred.resolve();
                        }
                        else {
                            deferred.reject();
                        }
                    }, function () {
                        deferred.reject();
                    });

                    return deferred.promise;
                };
            }
        }
    });


当我在任何地方访问$scope.licenceKey时,即使我输入了内容,它也总是空的,尽管我对输入的自定义验证可以正常工作

请注意,有趣的是,当我绑定到Applying以控制有效的视图状态时!

更新资料

如果使用$scope.licenceForm.licenceKey.$modelValue,我可以获得价值,但我不明白为什么这样做是必要的?

更新2

另外,如果我最初设置了$scope.licenceKey = "test";,那么它会在页面加载时显示在文本框中,但是当我修改文本框时,该值将永远不会更新

最佳答案

可能是因为使用的是ng-if而不是ng-show指令。

这是因为ng-if从DOM中删除该元素,而ng-show使用css规则来隐藏该元素。

这是一个小提琴,演示了此http://jsfiddle.net/q9rnqju5/

的HTML

<div ng-app="app">
    <div ng-controller="controller">
        <div ng-show="!applying1">
            <input ng-model="value1" />
            <button ng-click="apply1()">Submit</button>
        </div>
        <div ng-if="!applying2">
            <input ng-model="value2" />
            <button ng-click="apply2()">Submit</button>
        </div>
    </div>
</div>


JS

var app = angular.module("app", []);

app.controller("controller", ["$scope", "$timeout", function($scope, $timeout) {
    $scope.apply1 = function() {
        $scope.applying1 = 1;
        $timeout(function() {
            console.log($scope.value1);
            $scope.applying1 = 0;
        }, 1000);
    };
    $scope.apply2 = function() {
        $scope.applying2 = 1;
        $timeout(function() {
            console.log($scope.value2);
            $scope.applying2 = 0;
        }, 1000);
    };
}]);


您可以看到,提交后,第一个输入(使用ng-show)将保留其值,而第二个输入(使用ng-if)将失去其值。

09-12 20:29