如何更改 Angular 指令中的 select 功能?
How to change select functions in Angular Directive?
http://plnkr.co/edit/pJRzKn2v1s865w5WZBkR?p=preview
我有一个很大的 select 下拉列表,它在 2 个地方重复出现。唯一改变的是第一个 select 标签,它具有不同的功能。
<!--
On simple, change ng-change function to functionOne
On advanced, change ng-change function to functionTwo
-->
<select name="name1" ng-change="functionOne('function1')" id="the-id-1">
<select name="name2" ng-change="functionTwo('function2)" id="the-id-2">
<option value="aaa">aaa</option>
<option value="bbb">bbb</option>
<option value="ccc">ccc</option>
</select>
我试过使用 ng-hide ng-show
但是必须有不同的方法来完成这个。
var app = angular.module('myApp', [])
.directive('termsForm', function() {
return {
templateUrl : "termsForm.html",
restrict : "E",
scope : false,
controller : 'TermsFormController'
}
})
.directive('selectOptions', function() {
return {
templateUrl : "form.html",
restrict : "E",
scope : false
}
})
.controller('TermsFormController',
['$scope',
function($scope) {
var vs = $scope;
vs.hello = "This is the form.";
vs.showingSimple = true;
vs.showingAdvanced = false;
vs.showForm = function(type) {
if (type === 'simple') {
vs.showingSimple = true;
vs.showingAdvanced = false;
} else if (type === 'advanced') {
vs.showingSimple = false;
vs.showingAdvanced = true;
}
}
vs.functionOne = function(msg) {
alert(msg);
}
vs.functionTwo = function(msg) {
alert(msg);
}
}]);
termsForm.html
<ul class="nav nav-tabs">
<button class="btn btn-info" ng-click="showForm('simple')">Simple</button>
<button class="btn btn-info" ng-click="showForm('advanced')">Advanced</button>
</ul>
<p>The select:</p>
<div ng-show="showingSimple" class="simple-form">
<p>Simple</p>
<select-options></select-options>
</div>
<div ng-show="showingAdvanced" class="advanced-form">
<p>Advanced</p>
<select-options></select-options>
</div>
我将重构您的标记和控制器以根据 simple/advanced 上下文进行调整。
在您的控制器中,您将公开一个 'generic' 下拉菜单的更改功能,首先...
(function () {
'use strict';
angular.module('app').controller('someCtrl', [someCtrl]);
function someCtrl() {
var vm = this;
vm.isSimple = true;
vm.nameChange = function () {
if(vm.isSimple)
functionOne('function1');
else
functionTwo('function2');
}
// Other things go here.
}
})();
...然后,在您看来,您的 select 将更改为 *:
<select id="someId" name="someName" ng-change="vm.nameChange()" />
*:假设您使用的是 controllerAs
语法。如果不是,请不要在 select
上添加 vm.
。
您已经为您的 select 创建了一个指令,这让您完成了一半。现在你只需要通过所谓的 隔离范围 传递函数。
.directive('selectOptions', function() {
return {
templateUrl : "form.html",
restrict : "E",
scope : {
changeFunc: '&'
}
}
})
这允许您传入要在 ng-change
事件中调用的函数:
<select-options changeFunc="function1"></select-options>
<select-options changeFunc="function2"></select-options>
然后在你的 form.html 中你只需输入
<select name="name2" ng-change="changeFunc()" id="the-id-2">
这样你基本上是将函数作为参数传入。阅读 this 博客,获取有关独立作用域的重要指南。
http://plnkr.co/edit/pJRzKn2v1s865w5WZBkR?p=preview
我有一个很大的 select 下拉列表,它在 2 个地方重复出现。唯一改变的是第一个 select 标签,它具有不同的功能。
<!--
On simple, change ng-change function to functionOne
On advanced, change ng-change function to functionTwo
-->
<select name="name1" ng-change="functionOne('function1')" id="the-id-1">
<select name="name2" ng-change="functionTwo('function2)" id="the-id-2">
<option value="aaa">aaa</option>
<option value="bbb">bbb</option>
<option value="ccc">ccc</option>
</select>
我试过使用 ng-hide ng-show
但是必须有不同的方法来完成这个。
var app = angular.module('myApp', [])
.directive('termsForm', function() {
return {
templateUrl : "termsForm.html",
restrict : "E",
scope : false,
controller : 'TermsFormController'
}
})
.directive('selectOptions', function() {
return {
templateUrl : "form.html",
restrict : "E",
scope : false
}
})
.controller('TermsFormController',
['$scope',
function($scope) {
var vs = $scope;
vs.hello = "This is the form.";
vs.showingSimple = true;
vs.showingAdvanced = false;
vs.showForm = function(type) {
if (type === 'simple') {
vs.showingSimple = true;
vs.showingAdvanced = false;
} else if (type === 'advanced') {
vs.showingSimple = false;
vs.showingAdvanced = true;
}
}
vs.functionOne = function(msg) {
alert(msg);
}
vs.functionTwo = function(msg) {
alert(msg);
}
}]);
termsForm.html
<ul class="nav nav-tabs">
<button class="btn btn-info" ng-click="showForm('simple')">Simple</button>
<button class="btn btn-info" ng-click="showForm('advanced')">Advanced</button>
</ul>
<p>The select:</p>
<div ng-show="showingSimple" class="simple-form">
<p>Simple</p>
<select-options></select-options>
</div>
<div ng-show="showingAdvanced" class="advanced-form">
<p>Advanced</p>
<select-options></select-options>
</div>
我将重构您的标记和控制器以根据 simple/advanced 上下文进行调整。
在您的控制器中,您将公开一个 'generic' 下拉菜单的更改功能,首先...
(function () {
'use strict';
angular.module('app').controller('someCtrl', [someCtrl]);
function someCtrl() {
var vm = this;
vm.isSimple = true;
vm.nameChange = function () {
if(vm.isSimple)
functionOne('function1');
else
functionTwo('function2');
}
// Other things go here.
}
})();
...然后,在您看来,您的 select 将更改为 *:
<select id="someId" name="someName" ng-change="vm.nameChange()" />
*:假设您使用的是 controllerAs
语法。如果不是,请不要在 select
上添加 vm.
。
您已经为您的 select 创建了一个指令,这让您完成了一半。现在你只需要通过所谓的 隔离范围 传递函数。
.directive('selectOptions', function() {
return {
templateUrl : "form.html",
restrict : "E",
scope : {
changeFunc: '&'
}
}
})
这允许您传入要在 ng-change
事件中调用的函数:
<select-options changeFunc="function1"></select-options>
<select-options changeFunc="function2"></select-options>
然后在你的 form.html 中你只需输入
<select name="name2" ng-change="changeFunc()" id="the-id-2">
这样你基本上是将函数作为参数传入。阅读 this 博客,获取有关独立作用域的重要指南。