gpt4 book ai didi

angularjs - ng-click 在指令模板中不起作用

转载 作者:行者123 更新时间:2023-12-03 07:34:22 26 4
gpt4 key购买 nike

这里是有 Angular 的菜鸟。我正在创建一个指令来递归地显示问题树和子问题。我在模板中使用一个链接,该链接调用范围内的函数。由于某种原因,它没有调用 editQuestion() 方法。

这是代码和 fiddle http://jsfiddle.net/madhums/n9KNv/

HTML:

<div ng-controller="FormCtrl">
<questions value="survey.questions"></questions>
</div>

Javascript:

var app = angular.module('myApp', []);

function FormCtrl ($scope) {
$scope.editQuestion = function (question) {
alert('abc');
};
$scope.survey = {
// ...
}
}


app.directive('questions', function($compile) {
var tpl = '<ol ui-sortable' +
' ng-model="value"' +
' class="list">' +
' <li ng-repeat="question in value | filter:search"' +
' <a href="" class="question">' +
' {{ question.name }}' +
' </a>' +
' <span class="muted">({{ question.type }})</span>' +
' <a href="" class="danger" ng-click="removeQuestion(question)">remove</a>' +
' <a href="" class="blue" ng-click="editQuestion(question)">edit</a>' +
' <choices value="question.choices"></choices>' +
' </li>' +
'</ol>';

return {
restrict: 'E',
terminal: true,
scope: { value: '=' },
template: tpl,
link: function(scope, element, attrs) {
$compile(element.contents())(scope.$new());
}
};
});

app.directive('choices', function($compile) {
var tpl = '<ul class="abc" ng-repeat="choice in value">'+
' <li>' +
' {{ choice.name }}' +
' <span class="muted">' +
' ({{ choice.questions.length }} questions)' +
' </span>' +
'' +
' <a href=""' +
' ng-click="addQuestions(choice.questions)"' +
' tooltip="add sub questions">' +
' +' +
' </a>' +
'' +
' <questions value="choice.questions"></questions>'
' </li>' +
'</ul>';

return {
restrict: 'E',
terminal: true,
scope: { value: '=' },
template: tpl,
link: function(scope, element, attrs) {
$compile(element.contents())(scope.$new());
}
};
});

任何有助于理解这一点的帮助将不胜感激。

最佳答案

您遇到了范围问题。由于您在指令中使用了 scope: { value: '=' } 的独立作用域,因此它不再能够访问具有 editQuestion 的 Controller 作用域。

您需要将 editQuestion 传递到指令的作用域,以便它知道如何调用它。这通常非常简单,但由于无限递归的指令结构(其中选择可以包含问题),它会变得有点棘手。这是一个工作 fiddle :

http://jsfiddle.net/n9KNv/14/

HTML 现在包含对 editQuestion 的引用:

<div ng-controller="FormCtrl">
<questions value="survey.questions" on-edit="editQuestion(question)"></questions>
</div>

您的 questions 指令现在需要在其范围内有一个 onEdit 属性:

app.directive('questions', function($compile) {
var tpl = '<ol ui-sortable' +
' ng-model="value"' +
' class="list">' +
' <li ng-repeat="question in value | filter:search"' +
' <a href="" class="question">' +
' {{ question.name }}' +
' </a>' +
' <span class="muted">({{ question.type }})</span>' +
' <a href="" class="blue" ng-click="onEdit({question: question})">edit</a>' +
' <choices value="question.choices" on-edit="onEdit({question: subQuestion})"></choices>' +
' </li>' +
'</ol>';

return {
restrict: 'E',
terminal: true,
scope: { value: '=', onEdit: '&' },
template: tpl,
link: function(scope, element, attrs) {
$compile(element.contents())(scope.$new());
}
};
});

app.directive('choices', function($compile) {
var tpl = '<ul class="abc" ng-repeat="choice in value">'+
' <li>' +
' {{ choice.name }}' +
' <span class="muted">' +
' ({{ choice.questions.length }} questions)' +
' </span>' +
'' +
' <questions value="choice.questions" on-edit="onEdit({subQuestion: question})"></questions>'
' </li>' +
'</ul>';

return {
restrict: 'E',
terminal: true,
scope: { value: '=', onEdit: '&' },
template: tpl,
link: function(scope, element, attrs) {
$compile(element.contents())(scope.$new());
}
};
});

请注意我们如何在 ng-click 中定位问题。这就是您在回调函数中定位参数的方式。另请注意,在 on-edit 中,我们如何传递给您的 choices 指令,我们的目标是 subQuestion。这是因为 question 已经被保留在 ngRepeat 内部,所以我们需要区分两者。

这可能是迄今为止我在 Angular 中学习的最难的概念。一旦您了解了 Controller 、指令和其他指令之间的作用域如何工作,Angular 的世界就属于您了。 :)

关于angularjs - ng-click 在指令模板中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16488769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com