我的Jquerymetis菜单有问题。我想从数据库中加载菜单元素,并且我使用AngujarJS控制器来获取带有菜单元素的JSON。
这是AngularJSController
var appControllers = angular.module('appControllers', []);
appControllers.controller('MenuCtrl', ['$scope', '$http',
function ($scope, $http) {
var url = "/api/Menus/GetMenuElements";
$http.post(url).
success(function (data, status, headers, config) {
$scope.menuElements = data;
console.log("Success");
}).
error(function (data, status, headers, config) {
console.log("Error");
});
}]);
然后在我的ASP.NET MVC项目的PartialView中,我有Angular指令将元素添加到菜单中。
<ul class="nav" id="side-menu">
<li ng-repeat="elementL1 in menuElements" ng-init="menuElements != null">
<a ng-if="elementL1.LINK !== null" href="{{elementL1.LINK}}"><i class="fa fa-home"></i> <span class="nav-label">{{elementL1.NAME}}</span><span class="fa arrow"></span></a>
<a ng-if="elementL1.LINK == null"><i class="fa fa-home"></i> <span class="nav-label">{{elementL1.NAME}}</span> </a>
<ul ng-repeat="elementL2 in elementL1.ChildMenu" ng-if="elementL1.ChildMenu.length > 0" class="nav nav-second-level">
<li class="primerLi">
<a>{{elementL2.NAME}}<span class="fa arrow"></span></a>
<ul ng-if="elementL2.ChildMenu.length > 0" class="nav nav-third-level">
<li ng-repeat="elementL3 in elementL2.ChildMenu">
<a href="{{elementL3.LINK}}">{{elementL3.NAME}}</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
这会将元素添加到菜单中,但它不会崩溃和扩展。它扩大了,我无法摧毁这些元素。
我认为问题是我必须在加载元素后调用$('#side-menu').metisMenu();
,但如果我在浏览器控制台上调用它,它就不起作用。
怎么能实现这个目标?我是Angular的新人。在这里,我看到了同样的问题,但我无法解决问题。 https://github.com/onokumus/metisMenu/issues/22
修改
我发现Metis菜单不能多次调用。我从onready事件JS中删除了$('#side-menu').metisMenu();
,我从浏览器控制台调用它,它现在可以工作了。
现在我需要帮助才能在加载菜单元素时使用angular调用它。我是Angular的新人,我需要一些帮助。
答案 0 :(得分:5)
我已经解决了使用Angular Directive在ng-repeat的最后一个元素呈现给DOM时执行metisMenu函数的问题。
app.directive('metis', function ($timeout) {
return function ($scope, $element, $attrs) {
if ($scope.$last == true) {
$timeout(function () {
$('#side-menu').metisMenu();
}, 250)
}
};
});
然后我必须在Ng repeat元素
上使用该指令<li ng-repeat="elementL1 in menuElements" ng-init="menuElements != null" metis="">
您可以在我的问题上看到完整的HTML代码。
我对Angular很新,所以我不是专家。即使我希望这个解决方案可以帮助某人。
答案 1 :(得分:1)
MetisMenu无法多次调用,因为它在其生命周期内仅调用init()
个函数。
这意味着如果您使用ajax异步加载元素<ul class="nav" id="side-menu">
的内容,之后<ul class="nav" id="side-menu">
再次将事件绑定到$('#side-menu').metisMenu();
将不会产生任何影响。< / p>
所以你要做的就是首先销毁现有的metismenu事件处理程序,然后创建一个新的,如下所示:
$('#side-menu').metisMenu('dispose'); //For stop and destroy metisMenu
$('#side-menu').metisMenu();
所以 AngularJS控制器应如下所示:
var app = angular.module('app', []);
app.controller('MenuCtrl', ['$scope', '$http',
function ($scope, $http) {
var url = "/api/Menus/GetMenuElements";
$http.post(url)
.success(function (data, status, headers, config) {
angular.element("#side-menu").metisMenu('dispose'); //Destroy the existing metisMenu
$scope.menuElements = data;
angular.element("#side-menu").metisMenu(); //Create new binding
console.log("Success");
})
.error(function (data, status, headers, config) {
console.log("Error");
});
}
]);