如何在 Angular JS 中动态添加输入表单
How to add input forms dynamically in Angular JS
我想动态更改表单输入,我已经尝试使用 ng-bind-html 来做到这一点,但只显示标签,文本框没有出现在 DOM.这里必须在 ctrl.content 中写入的内容取决于服务器的值。
备注
type value will be coming from server , and it can be dynamic
HTML
<div ng-bind-html="ctrl.content">
控制器
function myCtrl(type) {
var ctrl = this;
switch (type) {
case 1:
ctrl.content = " <div> Input : <input type=\"text\" > </div> ";
break;
case 2:
ctrl.content = " <div> Input : <input type=\"textarea\" > </div> ";
break;
default:
}
Dom 元素:
<div class="padding ng-binding ng-scope" ng-bind-html="addMeassurments.content"> <div> Input : </div> </div>
使用 ng-if 代替 ng-bind-html。
像这样:
<div>
<div ng-if="type===1">Input : <input type="text"></div>
<div ng-if="type===2">Input : <input type="textarea"></div>
</div>
并且在您的控制器中,您只需要动态地分配类型 1 或 2 作为值。
您应该将 $sce
服务与 ngSanitize
模块一起使用:
angular.module('app', ['ngSanitize'])
.controller('MyController', ['$scope', '$sce', function($scope, $sce) {
$scope.html = function(){
return $sce.trustAsHtml(`<div> Input : <input type=\"${$scope.type == 0 ? 'text' : 'textarea'}\" > </div>`);
}
}]);
<script src="//code.angularjs.org/snapshot/angular.min.js"></script>
<script src="//code.angularjs.org/snapshot/angular-sanitize.js"></script>
<body ng-app="app">
<div ng-controller="MyController" ng-init='type="0"'>
text: <input type="radio" ng-model="type" value="0">
textarea: <input type="radio" ng-model="type" value="1">
<div ng-bind-html="html()"></div>
</div>
</body>
textarea
无法呈现 HTML
输入类型,如 <input type=\"textarea\" >
..
并尝试 $sce
。
var app = angular.module('exApp',[]);
app.controller('ctrl', function($scope,$sce){
$scope.text = $sce.trustAsHtml("<div> Input : <input type=\"text\" > </div> ");
$scope.textArea = $sce.trustAsHtml(" <div> Input : <textarea></textarea> </div> ");
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="exApp" ng-controller="ctrl">
<div ng-bind-html="text"></div><br>
<div ng-bind-html="textArea"></div><br>
</body>
首先,你的作业全错了
ctrl.content = " <div> Input : <input type=\"text\" > </div> ";
您应该将标记分配给 $scope 属性。例如
$scope.content = " <div> Input : <input type=\"text\" > </div> ";
其次,您应该使用 $sce service to sanitize the html. Here's a plnkr,此代码演示了预期的行为
var app = angular.module('plunker', []);
app.controller('Ctrl', function($scope, $sce) {
$scope.name = 'World';
var ctrl = this;
$scope.click = function myCtrl(type) {
switch (type) {
case 1:
$scope.content = $sce.trustAsHtml("<div> Input : <input type=\"text\" > </div> ");
break;
case 2:
$scope.content = $sce.trustAsHtml(" <div> Input : <textarea></textarea> </div> ");
break;
default:
}
}
});
另请注意,我将您的标记从 input type="textarea" 更改为 textarea 元素。
我想动态更改表单输入,我已经尝试使用 ng-bind-html 来做到这一点,但只显示标签,文本框没有出现在 DOM.这里必须在 ctrl.content 中写入的内容取决于服务器的值。
备注
type value will be coming from server , and it can be dynamic
HTML
<div ng-bind-html="ctrl.content">
控制器
function myCtrl(type) {
var ctrl = this;
switch (type) {
case 1:
ctrl.content = " <div> Input : <input type=\"text\" > </div> ";
break;
case 2:
ctrl.content = " <div> Input : <input type=\"textarea\" > </div> ";
break;
default:
}
Dom 元素:
<div class="padding ng-binding ng-scope" ng-bind-html="addMeassurments.content"> <div> Input : </div> </div>
使用 ng-if 代替 ng-bind-html。
像这样:
<div>
<div ng-if="type===1">Input : <input type="text"></div>
<div ng-if="type===2">Input : <input type="textarea"></div>
</div>
并且在您的控制器中,您只需要动态地分配类型 1 或 2 作为值。
您应该将 $sce
服务与 ngSanitize
模块一起使用:
angular.module('app', ['ngSanitize'])
.controller('MyController', ['$scope', '$sce', function($scope, $sce) {
$scope.html = function(){
return $sce.trustAsHtml(`<div> Input : <input type=\"${$scope.type == 0 ? 'text' : 'textarea'}\" > </div>`);
}
}]);
<script src="//code.angularjs.org/snapshot/angular.min.js"></script>
<script src="//code.angularjs.org/snapshot/angular-sanitize.js"></script>
<body ng-app="app">
<div ng-controller="MyController" ng-init='type="0"'>
text: <input type="radio" ng-model="type" value="0">
textarea: <input type="radio" ng-model="type" value="1">
<div ng-bind-html="html()"></div>
</div>
</body>
textarea
无法呈现 HTML
输入类型,如 <input type=\"textarea\" >
..
并尝试 $sce
。
var app = angular.module('exApp',[]);
app.controller('ctrl', function($scope,$sce){
$scope.text = $sce.trustAsHtml("<div> Input : <input type=\"text\" > </div> ");
$scope.textArea = $sce.trustAsHtml(" <div> Input : <textarea></textarea> </div> ");
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="exApp" ng-controller="ctrl">
<div ng-bind-html="text"></div><br>
<div ng-bind-html="textArea"></div><br>
</body>
首先,你的作业全错了
ctrl.content = " <div> Input : <input type=\"text\" > </div> ";
您应该将标记分配给 $scope 属性。例如
$scope.content = " <div> Input : <input type=\"text\" > </div> ";
其次,您应该使用 $sce service to sanitize the html. Here's a plnkr,此代码演示了预期的行为
var app = angular.module('plunker', []);
app.controller('Ctrl', function($scope, $sce) {
$scope.name = 'World';
var ctrl = this;
$scope.click = function myCtrl(type) {
switch (type) {
case 1:
$scope.content = $sce.trustAsHtml("<div> Input : <input type=\"text\" > </div> ");
break;
case 2:
$scope.content = $sce.trustAsHtml(" <div> Input : <textarea></textarea> </div> ");
break;
default:
}
}
});
另请注意,我将您的标记从 input type="textarea" 更改为 textarea 元素。