Angular中指令和控制器之间的变量交换
Variable exchange between directive and controller in Angular
我知道这个问题已经被问过很多次了,但我似乎找不到适合我的答案。
现在我有一个"邀请更多的人"的表单,它需要一个名字和电子邮件。在表单下面是一个"邀请更多的朋友"按钮,该按钮将触发一个指令"add-more-person",该指令将添加另一个表单。
我希望人们不能邀请超过10个朋友。当有10个"邀请朋友表单"时,我希望按钮被隐藏。
所以我在指令中添加了一个计数器,这样你就不能在有10个表单之后添加更多的表单,并在我的控制器中添加一个布尔值"addFriends"。
现在我想要我的布尔addFriends改变为false每当指令的计数器达到一定的数量
我不能使用$watch来实现这个,因为我没有使用$scope,而且我尝试过的所有其他方法也都失败了。
下面是我的代码:<div class="row">
<div class="column medium-6">
<button ng-show="post.addFriends" class="btn-grey" type="button" add-more-person add-friends="post.addFriends">Invite more people</button>
</div>
<div class="column medium-6">
<button class="btn-green" type="button">Send</button>
</div>
</div>
指令:
(function() {
'use strict';
angular.module('app').directive('addMorePerson', addMorePerson);
function addMorePerson($rootScope, $window, $timeout) {
return {
restrict: 'A',
scope: {
addFriends: '='
},
link: function(scope, elem, attr) {
var counter = 0;
console.log('start: ' + scope.addFriends);
elem.bind('click', appendInput);
function appendInput() {
if(counter < 2) {
var myEl = angular.element(document.querySelector('#content-form'));
var template = '<div class="content">' +
'<div class="form-page">' +
'<div class="form-field">' +
'<label class="form-label">Naam:</label>' +
'<div class="form-controls">' +
'<input kl_virtual_keyboard_secure_input="on" type="text">' +
'</div>' +
'</div>' +
'<div class="form-field">' +
'<label class="form-label">E-mail <span>(verplicht)</span>:</label>' +
'<div class="form-controls">' +
'<input type="email">' +
'</div>' +
'</div>' +
'</div>' +
'</div>';
myEl.append(template);
counter++;
} else {
scope.addFriends = false;
console.log('after: ' + scope.addFriends);
return;
}
}
}
};
}
})();
和Controller:
(function() {
'use strict';
angular
.module('app')
.controller('PostDonateController', postDonateController);
function postDonateController(apiFactory, $sessionStorage, $localStorage, $state, $stateParams) {
var that = this; // jshint ignore: line
that.addFriends = true;
}
})();
我省略了所有其他代码以使其更易于阅读。所以我的控制台日志在指令中告诉我,它确实开始于true,经过3次点击后,它变成了false。但是这个值没有传递给我的控制器,因此没有隐藏按钮。你知道我该怎么做吗?
在append函数的列表行调用scope.$apply();
,它将在指令和控制器之间执行同步。你应该这样做,因为你在angular上下文之外附加了模板。
但是你的解决方案很尴尬,你应该通过ng-repeat添加模板。
相关文章:
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 用于交换两个变量的 JavaScript 函数
- 在js中交换变量
- JavaScript:交换没有临时变量的字符串变量
- 在两个HTML和PHP之间交换变量
- 有没有一种方法可以在JavaScript和PHP之间交换变量
- 如何使用JavaScript在HTML之间交换变量
- Javascript 命名空间 - 函数之间的变量交换
- 使用数组进行Javascript变量交换
- PHP/Javascript:变量交换&函数调用
- Angular中指令和控制器之间的变量交换
- 这两个变量如何用一行来交换?
- SRC是未定义的图像交换变量
- 用jquery或javascript交换4个变量的值
- 交换时更改img(三个变量)
- 在网站内单击时,将javascript变量(trailimage)交换为另一个需要什么代码
- 在PHP和JavaScript之间交换变量