所以我创建了一个角度js模块,并尝试链接服务并使用此服务在整个应用程序中共享变量。一切正常,但是当我尝试将子菜单[1]设置为一个对象时,它表示子菜单[1]未定义。哪个是正确的还没有创建。但我只想将子菜单[1]设置为等于一个对象。不明白为什么要创建它。不确定为什么它说Uncaught TypeError:无法读取未定义的属性子菜单。我console.log menuArray [key]我正在使用它返回undefined。但这也没有意义。
setSubMenu : function(key, subKey, value){ console.log(sharedVariables.menuArray[key]); sharedVariables.menuArray[key].subMenu[subKey] = value; }
这就是我所拥有的:
var myModule = angular.module('companiesApp', ['ngResource']).config(function($routeProvider) {
$routeProvider
.when ('/', {controller:ListCtrl, template: $('#companies-list').html()})
.when ('/new', {controller:NewCtrl, template: $('#companies-edit').html()})
.when('/newMenu/:companyID', {controller:EditMenuCtrl, template: $('#menu-edit').html()})
.when ('/edit/:companyID', {controller:EditCtrl, template: $('#companies-edit').html()})
.when ('/editMenu/:companyID', {controller:EditMenuCtrl, template: $('#menu-edit').html()})
.when ('/settings/:companyID', {controller:SettingsCtrl, template: $('#companies-settings').html()})});
myModule.service('sharedVariables', function(){
var sharedVariables = { count : 0, originalCount : 0, menuArray : []};
return{
getOriginalCount : function(){
return sharedVariables.originalCount;
},
setOriginalCount : function(value){
sharedVariables.originalCount = value;
},
getCount : function(){
return sharedVariables.count;
},
setCount : function(value){
sharedVariables.count = value;
},
getMenu : function(){
return sharedVariables.menuArray;
},
setMenu : function(key, value){
sharedVariables.menuArray[key] = value;
},
setMenuName : function(key,value){
sharedVariables.menuArray[key].name = value;
},
setMenuEndPos : function(key, posLeft, posTop){
sharedVariables.menuArray[key].endPosLeft = posLeft;
sharedVariables.menuArray[key].endPosTop = posTop;
},
setSubMenu : function(key, subKey, value){
sharedVariables.menuArray[key].subMenu[subKey] = value;
}
};
});
function EditMenuCtrl($scope,$routeParams, $location, sharedVariables){
var count = 0;
$scope.companyID = $routeParams.companyID;
$scope.menuArray = [];
$.ajax({
url : "companies.php",
type : "post",
data : {
action : "getMenus",
id : $routeParams.companyID
},
success : function(data,status){
var responses = JSON.parse(data);
$('#menu').empty();
for(i in responses){
//if the Root Order LI has not been created, create it
if($('#li-' + responses[i].rootORDER).length == 0){
count++;
var html = '<li id="li-' + responses[i].rootORDER + '" class="dropdown">' + '<a id="link-' + responses[i].rootORDER;
html += '" role="button" class="dropdown-toggle" data-type="text" data-toggle="dropdown">' + responses[i].menuROOT;
html += '</a>' + '<ul id="ul-' + responses[i].rootORDER;
html += '" class="dropdown-menu" role="menu" aria-labelledby="dLabel" ><li role="presentation"><a href="javascript:void(0)" onclick="addLITOUL()" role="menuitem"><i class="icon-plus-sign"></i></a></li></ul></li>';
$('#menu').append(html);
//Record the Start Position of the Element
var Start = $('#li-' + responses[i].rootORDER).position();
sharedVariables.setMenu(responses[i].rootOrder, {name : responses[i].menuROOT, startPosLeft : Start.left, startPosTop : Start.top, subMenu : []});
//Make the Title Editable
$('#link-' + responses[i].rootORDER).editable(function(value,settings){
var tempID = $(this).attr('id');
tempID = tempID.substring(5);
sharedVariables.setMenuName(tempID,value);
return(value);
});
//Make the DropDowns and make them draggable
$('.dropdown-toggle').dropdown();
$('.dropdown').draggable({
containment: "#container",
scroll: false,
snap: true,
stop: function(event, ui) {
var Stoppos = $(this).position();
$("#position").text("STOP: \nLeft: "+ Stoppos.left + "\nTop: " + Stoppos.top);
var tempID = $(this).attr("id");
tempID = tempID.substring(3); //remove li- to get the index into the array
sharedVariables.setMenuEndPos(tempID, Stoppos.left, Stoppos.top);
}
});
}//end of if
}//end of (for i in responses)
sharedVariables.setOriginalCount(count);
sharedVariables.setCount(count);
//Fill in the inner UL with it's links
for(i in responses){
html = '<li id="' + i + '-' + responses[i].menuTITLE+ '" role="presentation"><a role="menuitem" href="javascript:void(0)">' + responses[i].menuTITLE + '</a>';
html += '</li>';
$('#ul-' + responses[i].rootORDER).append(html);
sharedVariables.setSubMenu(responses[i].rootORDER, responses[i].linkORDER, {name: responses[i].menuTITLE});
}
}
});
console.log(sharedVariables.getOriginalCount());
}
答案 0 :(得分:2)
我敢说你的问题与你使用不同的键setMenu
和responses[i].rootOrder
来调用setSubMenu
这一事实有关{ {1}}。根据你的其余代码判断,responses[i].rootORDER
可能是未定义的,这应该在其他地方给出奇怪的结果......