AngularJS:从select获取值并基于它注入HTML
AngularJS: Get value from select and inject HTML based on it
我正在制作联系表。关键是它应该可以在没有 JavaScript 的情况下访问。如果 JavaScript 可用,我想根据访问者的联系目的询问一些细节。
HTML 可能看起来像这样(故意跳过标签,以缩短代码):
<form action="">
<select name="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<button>Submit</button>
</form>
好吧,如果可以的话,我只想添加一些将根据 "model" 显示的区域。但我做不到,因为我不想向没有 JS 的人展示额外的字段。
应该是这样的:
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-show="purpose == 'support'">
<input type="text" name="customernumber" />
</div>
<div ng-show="purpose == 'interview'">
Sorry, I'm not giving interviews
</div>
...
<button>Submit</button>
</form>
关键是我会问很多额外的问题。禁用 JS 后,访问者将看到一个包含所有字段和消息的臃肿联系表。
我正在寻找一种解决方案,它可以读取 HTML 的值并将其从 JS 文件注入到特定位置。
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
{{injectedHTML}}
...
<button>Submit</button>
</form>
听起来很奇怪,但一切都必须按照当地市政办公室的要求。他们只想向使用 JS 的人显示这些特定字段。
也许他们认为这对可访问性有好处。我不确定。
谢谢大家
要在禁用 JavaScript 时简单地隐藏一组元素,您可以将 ng-hide
class 添加到不应显示的元素。例如:
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-show="purpose == 'support'" class="ng-hide">
<input type="text" name="customernumber" />
</div>
<div ng-show="purpose == 'interview'" class="ng-hide">
Sorry, I'm not giving interviews
</div>
...
<button>Submit</button>
</form>
ng-hide
class 集 display: hidden
。启用 JavaScript 后,ng-show
将评估条件并从元素中添加或删除 ng-hide
class。
另一个相当简单的解决方案是在适当的时候使用 ng-include
加载额外的内容——这显然只有在启用 JavaScript 时才有效——从而在 JavaScript 时隐藏额外的字段不工作。
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-if="purpose == 'support'" ng-include="'views/supportField.html'">
</div>
<div ng-if="purpose == 'interview'" ng-include="'views/interviewField.html'">
</div>
...
<button>Submit</button>
</form>
感谢 miensol,我开始考虑使用 "ng-include" 的方法。然后我意识到一件事:Angular 可以覆盖 HTML.
所以我带来了这个 HTML:
<form ng-controller="ContactController">
<select ng-model="purpose" ng-options="p.title for p in possibilities track by p.value">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
<div ng-include="purpose.template"></div>
</form>
还有这个app.js:
(function(){
var app = angular.module('myApp', []);
app.controller('ContactController', ['$scope', function($scope) {
// array with possible reasons, that we use as <option> in <select>
// the "AJ" is added so you can see the difference
$scope.possibilities =
[
{ title: 'AJ Just saying hi', value='hello', template: 'part-support.html'},
{ title: 'AJ Customer Support', value='support', template: 'part-support.html'},
{ title: 'AJ Interview', value='interview', template: 'part-interview.html'}
];
// select default <option>
$scope.purpose = $scope.possibilities[0];
}]);
})();
我仍然觉得它可以写得更好(而且它超出了我的能力范围)。
我正在制作联系表。关键是它应该可以在没有 JavaScript 的情况下访问。如果 JavaScript 可用,我想根据访问者的联系目的询问一些细节。
HTML 可能看起来像这样(故意跳过标签,以缩短代码):
<form action="">
<select name="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<button>Submit</button>
</form>
好吧,如果可以的话,我只想添加一些将根据 "model" 显示的区域。但我做不到,因为我不想向没有 JS 的人展示额外的字段。 应该是这样的:
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-show="purpose == 'support'">
<input type="text" name="customernumber" />
</div>
<div ng-show="purpose == 'interview'">
Sorry, I'm not giving interviews
</div>
...
<button>Submit</button>
</form>
关键是我会问很多额外的问题。禁用 JS 后,访问者将看到一个包含所有字段和消息的臃肿联系表。
我正在寻找一种解决方案,它可以读取 HTML 的值并将其从 JS 文件注入到特定位置。
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
{{injectedHTML}}
...
<button>Submit</button>
</form>
听起来很奇怪,但一切都必须按照当地市政办公室的要求。他们只想向使用 JS 的人显示这些特定字段。 也许他们认为这对可访问性有好处。我不确定。
谢谢大家
要在禁用 JavaScript 时简单地隐藏一组元素,您可以将 ng-hide
class 添加到不应显示的元素。例如:
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-show="purpose == 'support'" class="ng-hide">
<input type="text" name="customernumber" />
</div>
<div ng-show="purpose == 'interview'" class="ng-hide">
Sorry, I'm not giving interviews
</div>
...
<button>Submit</button>
</form>
ng-hide
class 集 display: hidden
。启用 JavaScript 后,ng-show
将评估条件并从元素中添加或删除 ng-hide
class。
另一个相当简单的解决方案是在适当的时候使用 ng-include
加载额外的内容——这显然只有在启用 JavaScript 时才有效——从而在 JavaScript 时隐藏额外的字段不工作。
<form action="" ng-app>
<select name="purpose" ng-model="purpose">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
...
<div ng-if="purpose == 'support'" ng-include="'views/supportField.html'">
</div>
<div ng-if="purpose == 'interview'" ng-include="'views/interviewField.html'">
</div>
...
<button>Submit</button>
</form>
感谢 miensol,我开始考虑使用 "ng-include" 的方法。然后我意识到一件事:Angular 可以覆盖 HTML.
所以我带来了这个 HTML:
<form ng-controller="ContactController">
<select ng-model="purpose" ng-options="p.title for p in possibilities track by p.value">
<option value="hello">Just saying hi</option>
<option value="support">Customer Support</option>
<option value="interview">Interview</option>
</select>
<div ng-include="purpose.template"></div>
</form>
还有这个app.js:
(function(){
var app = angular.module('myApp', []);
app.controller('ContactController', ['$scope', function($scope) {
// array with possible reasons, that we use as <option> in <select>
// the "AJ" is added so you can see the difference
$scope.possibilities =
[
{ title: 'AJ Just saying hi', value='hello', template: 'part-support.html'},
{ title: 'AJ Customer Support', value='support', template: 'part-support.html'},
{ title: 'AJ Interview', value='interview', template: 'part-interview.html'}
];
// select default <option>
$scope.purpose = $scope.possibilities[0];
}]);
})();
我仍然觉得它可以写得更好(而且它超出了我的能力范围)。