您好我正在研究angularjs。我在指令中面临一个问题
我在链接/点击事件上设置了scope.user.name="amin shah"
并希望在控制器中访问它如何可能?
var dataSourceDirective = angular.module('mydirective', []);
dataSourceDirective.directive('dir', function () {
return {
restrict: 'C',
scope: true,
link: function ($scope, element, attrs) {
element.bind('click', function () {
$scope.user.name ="amin shah";
$scope.$apply();
$('.sourceType_panel').hide();
$('#sourceType_1_panel').show();
});
}
}
});
控制器代码
$scope.demo = function () {
console.log($scope.user);`
},
答案 0 :(得分:1)
您需要在指令中创建隔离范围。 给定的控制器应该是该指令的父级。
<div ng-copntroller='yourCtrl'>
<dir user="user"></dir>
</div>
在html中:
user
在控制器中,您应该初始化$rootScope.$emit('user_name_update',user);
。
OR
如果父母是控制者,则使用$broadcast & $emit。
使用指令的链接功能,您可以使用$scope.$on('user_name_update',function(data){
console.log(user) // its should give your updated `user` object
})
在控制器中你可以听这个事件
$(document).keydown(function(e) {
switch(e.which) {
case 37: // left
break;
case 38: // up
break;
case 39: // right
break;
case 40: // down
break;
default: return; // exit this handler for other keys
}
e.preventDefault(); // prevent the default action (scroll / move caret)
});
答案 1 :(得分:0)
首先,你应该纠正你的链接方法,我认为你不应该在那里需要孩子。所以你也应该在指令中删除你的范围绑定。您可以使用链接方法访问父作用域。
app.directive('dir', function () {
return {
restrict: 'E',
link: function (scope, element, attrs) {
element.bind('click', function () {
scope.user.name ="amin shah";
scope.$apply();
});
}
}
});
在您的控制器中,您可以像这样定义范围变量:
app.controller('MainCtrl', function($scope) {
$scope.user = {
name: ''
}
});
你也应该把这个指令添加到HTML:
<dir>Element</dir>
<p>{{user.name}}</p>
这是工作plunkr
你应该点击元素,而不是你可以从指令中看到你的名字,但是在父范围内