从自定义指令调用角度路由
Call an angular route from a custom directive
我在ASP.NET MVC应用程序中有一个AngularJS。我的用例是一个手风琴,它是在点击事件时填充的。每个Item都是一个指令,在模板中我有两个div,一个显示表头,另一个隐藏。单击标题,我将用DOM填充隐藏的div并打开它,我尝试使用$http。我遇到了一个问题,不是用#解决路由,而是到我的MVC控制器
//这是我的主要角度模块
window.progCheckList = angular.module("progCheckList", []);
progCheckList.config(["$routeProvider", function ($routeProvider) {
$routeProvider.when("/MainCheckList", {
controller: "mainCheckListCtrl",
templateUrl: "/AngularJSApp/ProgramCheckList/Templates/mainCheckList.html"
})
.when("/MDFDecisions", {
controller: "mdfDecisionsCtrl",
templateUrl: "/AngularJSApp/ProgramCheckList/Templates/mdfDecisions.html"
})
.otherwise({ redirectTo: '/MainCheckList' });
}
]);
//Inside of MainCheckList I have
<div style="clear: both; display: block;">
<check-list-item data-ng-repeat="checkList in data.ProgramCheckList.ProgramCheckLists" value="checkList">
</check-list-item>
</div>
//CheckListItem is a directive
progCheckList.directive('checkListItem', function ($http) {
return {
restrict: 'E',
templateUrl: "/AngularJSApp/ProgramCheckList/Templates/programCheckListItem.html",
scope: { value: "=value" },
transclude: true,
link: function (scope, element, attrs) {
element.find("button").on("click", function () {
});
element.find(".CheckListHeader").on("click", function () {
if (scope.value.Action != null && scope.value.Action != "") {
if (element.find(".CheckListHeader").hasClass("collapsed")) {
$http({ method: 'GET', url: "Index#/MDFDecisions" }).
success(function (data, status, headers, config) {
console.log(element.parent().find(".CheckListHeader").parent().next());
element.find(".CheckListHeader").parent().next().html(data);
element.find(".CheckListHeader").removeClass("collapsed");
element.find(".CheckListHeader").addClass("expanded");
element.find(".CheckListHeader").parent().next().show("slow");
}).
error(function (data, status, headers, config) {
toastr("Unable to get action");
});
element.find(".CheckListHeader").parent().next().show("slow");
} else if (element.find(".CheckListHeader").hasClass("expanded")) {
element.find(".CheckListHeader").parent().next().empty();
element.find(".CheckListHeader").removeClass("expanded");
element.find(".CheckListHeader").addClass("collapsed");
element.find(".CheckListHeader").parent().next().hide("slow");
}
}
});
}
};
});
//The Template that I'm using for the Directive
<div class="program-checklist" style="clear: both; vertical-align: middle; margin: 0.4em; cursor: pointer;">
<div style="height: 100%; width: 100%; resize: vertical;">
<div style="vertical-align: middle;">
<div class="CheckListHeader collapsed" style="float: left; vertical-align: middle; height: 3.5em;">
<h4>{{value.Functionality}}</h4>
</div>
<div style="float: right; vertical-align: middle; margin-right: 2em;">
<button class="btn btn-inverse updateCheckList" data-ng-click="UpdateStatus(value.CPMSCheckListId)">
Update Status
</button>
<img data-ng-src="{{value.IsReady && '../../Images/Checked.png' || '../../Images/UnChecked.png'}}" style="width: 36px; height: 36px; margin: 0.5em;" />
</div>
</div>
<div style="clear: both; display: none; width: 100%; height: 20em; overflow: auto;">
</div>
</div>
</div
当我点击标题时,我希望用DOM填充下一个DIV,调用AngularJS路由"Index#/MDFDecisions",我得到了非常奇怪的结果,它得到了Index MVC Action,而不是AngularJS路径。而且知道我怎样才能得到预期的结果吗?此外,我对代码的任何改进都持开放态度。这是我的第二个AngularJS应用程序,我正在使用这种方法。
提前谢谢。
最后我提出了一个不同的解决方案。我没有尝试在指令中获取DOM,而是将指令更改为包含带ng的隐藏DIV,并将指令中的src属性更改为范围值。
//Updated Directive Code
progCheckList.directive('checkListItem', function ($http) {
return {
restrict: 'E',
templateUrl: "/AngularJSApp/ProgramCheckList/Templates/programCheckListItem.html",
scope: { value: "=value" },
transclude: true,
link: function (scope, element, attrs) {
element.find("button").on("click", function () {
});
element.find(".CheckListHeader").on("click", function () {
if (scope.value.Action != null && scope.value.Action != "") {
if (element.find(".CheckListHeader").hasClass("collapsed")) {
scope.checkListItemTemplate = "/AngularJSApp/ProgramCheckList/Templates/mdfDecisions.html";
scope.$apply();
element.find(".CheckListHeader").removeClass("collapsed");
element.find(".CheckListHeader").addClass("expanded");
element.find(".CheckListHeader").parent().next().show("slow");
} else if (element.find(".CheckListHeader").hasClass("expanded")) {
element.find(".CheckListHeader").parent().next().empty();
element.find(".CheckListHeader").removeClass("expanded");
element.find(".CheckListHeader").addClass("collapsed");
element.find(".CheckListHeader").parent().next().hide("slow");
}
}
});
}
};
});
//Updated Directive Template
<div class="program-checklist" style="clear: both; vertical-align: middle; margin: 0.4em; cursor: pointer;">
<div style="height: 100%; width: 100%; resize: vertical;">
<div style="vertical-align: middle;">
<div class="CheckListHeader collapsed" style="float: left; vertical-align: middle; height: 3.5em;">
<h4>{{value.Functionality}}</h4>
</div>
<div style="float: right; vertical-align: middle; margin-right: 2em;">
<button class="btn btn-inverse updateCheckList" data-ng-click="UpdateStatus(value.CPMSCheckListId)">
Update Status
</button>
<img data-ng-src="{{value.IsReady && '../../Images/Checked.png' || '../../Images/UnChecked.png'}}" style="width: 36px; height: 36px; margin: 0.5em;" />
</div>
</div>
<div style="clear: both; display: none; width: 100%; height: 30em; overflow: auto;" data-ng-include="" src="checkListItemTemplate">
</div>
</div>
相关文章:
- 未调用主干路由
- Codeigniter :通过 AJAX 调用 php 脚本时路由不起作用
- 从 javascript 中调用快速路由
- 角度.js - 识别通过路由或 ng 控制器调用的控制器
- 如何从 on 调用调度更改反应路由器路由
- Angularjs:路由后如何调用控制器函数
- 将rails路由调用到CSS(在haml中)
- 从自定义指令调用角度路由
- 如何在Ember中转换到另一个路由时调用一个方法
- nodejs或expressjs在没有返回响应的情况下重复调用路由
- Ember添加了对转换调用上下文(路由/控制器)的检查
- 使用ng-include调用控制器时AngularJS路由解析
- Angular中的ajax调用和路由问题
- 通过express路由调用HTML中的Javascript函数
- 在 Express JS 中从路由调用函数对象
- 如何在AngularJS中从路由调用函数
- 从另一个路由调用一个hapi路由
- 在AngularJS中用RequireJS从路由调用controller时出错
- 使用angular路由调用$http
- 角度选项卡在通过路由调用的模板中不起作用