我在将输入框绑定到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
)将失去其值。