Angular 带有其他选项和文本框的 ng-model 组合框
Angular ng-model combobox with other option and a textbox
我有一个带有 ng-model='languale'
的组合框。我还有一个预定义列表,比如 'English', 'French', 'German' and 'Other'
如果我 select Other
选项则需要出现另一个文本框。我已经通过 ng-show
.
实现了此功能
现在我的问题出在我的JSON结构中,只有一个语言字段如下
var peopleData = {
language : 'English'
}
所以我无法在 select 和文本框中给出与 ng-model='peopleData.language'
相同的名称。
因为我的后端开发人员不想在 JSON 中添加额外的 属性。所以我必须以不同的方式处理它。我不想在向服务发送数据时编写任何逻辑(创建或操作 JSON 结构)。
那么有什么办法可以解决这个问题吗?
注意:我知道我可以使用$scope.$watch
但我仍然在寻找更好的解决方案,比如从视图中完全处理它自己,否则它可能是性能问题。
.:: 答案已更新 ::.
写一个简单的指令怎么样?
HTML:
<select ng-model="ctrl.main" f-model="peopleData.language" ng-options="i as i for i in langs"></select>
<input type="text" ng-model="ctrl.extra" f-model="peopleData.language" ng-if="ctrl.main == 'Other'">
JS:
app.directive('fModel', [function() {
return {
restrict: 'A',
require: 'ngModel',
scope: {
fModel: '='
},
link: function(scope, element, attrs, ngModel) {
var handler = function(val) {
var newVal = angular.copy(val || scope.fModel || '');
scope.$applyAsync(function() {
scope.fModel = newVal;
});
return newVal;
}
ngModel.$parsers.push(handler);
ngModel.$formatters.push(handler);
},
};
}]);
现场查看 IN THIS PLUNKR:
我认为可以通过
解决问题
在控制器中
$scope.languale = ['English', 'French', 'German' and 'Other'];
可见
<select ng-model="people.language" ng-options="lan in languale" ng-selected="lan==people.language"></select>
您可以在文本字段中使用 ng-change...
<input type="text" ng-model="otherLang" ng-change="peopleData.language=otherLang">
因为文本字段只有在选择了 其他 选项时才可见,所以我认为这会起作用。
查看:
<div ng-app="app">
<div ng-controller="Ctrl">
<select ng-model="peopleData.language" ng-options="item for item in languages"></select>
<!-- Show input when selected language is Other -->
<input type="text" ng-model="inputValue" ng-show="peopleData.language === 'Other'"/>
</div>
</div>
JS:
angular.module('app', [])
.controller('Ctrl',
function ($scope) {
$scope.inputValue = '';
// Languages list
$scope.languages = ['English', 'French', 'German', 'Other'];
// Selected language
$scope.peopleData = {
language : 'English'
};
}
);
演示:Here!
注意:使用 ng-show
将在选择任何语言时保留输入的值,它只是隐藏,而不是从 DOM 中删除。如果要重置输入值,请在这种情况下使用 ng-if
。
我有一个带有 ng-model='languale'
的组合框。我还有一个预定义列表,比如 'English', 'French', 'German' and 'Other'
如果我 select Other
选项则需要出现另一个文本框。我已经通过 ng-show
.
现在我的问题出在我的JSON结构中,只有一个语言字段如下
var peopleData = {
language : 'English'
}
所以我无法在 select 和文本框中给出与 ng-model='peopleData.language'
相同的名称。
因为我的后端开发人员不想在 JSON 中添加额外的 属性。所以我必须以不同的方式处理它。我不想在向服务发送数据时编写任何逻辑(创建或操作 JSON 结构)。
那么有什么办法可以解决这个问题吗?
注意:我知道我可以使用$scope.$watch
但我仍然在寻找更好的解决方案,比如从视图中完全处理它自己,否则它可能是性能问题。
.:: 答案已更新 ::.
写一个简单的指令怎么样?
HTML:
<select ng-model="ctrl.main" f-model="peopleData.language" ng-options="i as i for i in langs"></select>
<input type="text" ng-model="ctrl.extra" f-model="peopleData.language" ng-if="ctrl.main == 'Other'">
JS:
app.directive('fModel', [function() {
return {
restrict: 'A',
require: 'ngModel',
scope: {
fModel: '='
},
link: function(scope, element, attrs, ngModel) {
var handler = function(val) {
var newVal = angular.copy(val || scope.fModel || '');
scope.$applyAsync(function() {
scope.fModel = newVal;
});
return newVal;
}
ngModel.$parsers.push(handler);
ngModel.$formatters.push(handler);
},
};
}]);
现场查看 IN THIS PLUNKR:
我认为可以通过
解决问题在控制器中
$scope.languale = ['English', 'French', 'German' and 'Other'];
可见
<select ng-model="people.language" ng-options="lan in languale" ng-selected="lan==people.language"></select>
您可以在文本字段中使用 ng-change...
<input type="text" ng-model="otherLang" ng-change="peopleData.language=otherLang">
因为文本字段只有在选择了 其他 选项时才可见,所以我认为这会起作用。
查看:
<div ng-app="app">
<div ng-controller="Ctrl">
<select ng-model="peopleData.language" ng-options="item for item in languages"></select>
<!-- Show input when selected language is Other -->
<input type="text" ng-model="inputValue" ng-show="peopleData.language === 'Other'"/>
</div>
</div>
JS:
angular.module('app', [])
.controller('Ctrl',
function ($scope) {
$scope.inputValue = '';
// Languages list
$scope.languages = ['English', 'French', 'German', 'Other'];
// Selected language
$scope.peopleData = {
language : 'English'
};
}
);
演示:Here!
注意:使用 ng-show
将在选择任何语言时保留输入的值,它只是隐藏,而不是从 DOM 中删除。如果要重置输入值,请在这种情况下使用 ng-if
。