Привет, у меня есть такая директива,
mainApp.directive('myMenu',function(){
return {
restrict : 'E',
scope :{menuItems : "=menuItems"},
compile: function(element, attributes) {
var linkFunction = function($scope, element, attributes){
for (i = 0;i<$scope.menuItems.length;i++){
element.append('<li><a href="#home">'+$scope.menuItems[i].name+'</a></li>');
}
}
return linkFunction;
}
}
});
Я использую его, как показано ниже в своем HTML
<my-menu menuItems="menuItems"></my-menu>
Но в консоли я получаю сообщение об ошибке типа TypeError: не могу прочитать свойство "длина" неопределенного
использовать $scope.$eval(attributes.menuItems)
внутри функции компиляции, чтобы получить menuItems
Проблема была с именем, которое я использовал, так как menuItems в директиве должно быть равно элементам меню, решило проблему, отправив меню в меню.
Проблема может заключаться в том, что, тогда выполняется этап связывания, элементы меню могут не загружаться, поэтому $scope.menuItems
могут быть неопределенными.
Лучшим решением может быть
var mainApp = angular.module('my-app', [], function() {})
mainApp.controller('AppController', function($scope) {
$scope.menuItems = [{
name: 'one'
}, {
name: 'two'
}, {
name: 'three'
}, {
name: 'four'
}];
})
mainApp.directive('myMenu', function() {
return {
restrict: 'E',
scope: {
menuItems: "="
},
template: '<ul><li ng-repeat="item in menuItems">{{item.name}}<a href="#home"></a></li></ul>'
}
});
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
<div ng-app="my-app" ng-controller="AppController">
<my-menu menu-items="menuItems"></my-menu>
</div>
Если вы не можете использовать шаблон, тогда
var mainApp = angular.module('my-app', [], function() {})
mainApp.controller('AppController', function($scope) {
$scope.menuItems = [{
name: 'one'
}, {
name: 'two'
}, {
name: 'three'
}, {
name: 'four'
}];
})
mainApp.directive('myMenu', function() {
return {
restrict: 'E',
scope: {
menuItems: "=menuItems"
},
link: function($scope, element, attributes) {
$scope.$watch('menuItems', function(value) {
element.empty();
angular.forEach(value, function(item) {
element.append('<li><a href="#home">' + item.name + '</a></li>');
});
});
}
}
});
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
<div ng-app="my-app" ng-controller="AppController">
<my-menu menu-items="menuItems"></my-menu>
</div>
undefined
перед цикломif($scope.menuItems)