我有从对象数组生成的网页上的图标列表。当用户点击一个图标时,数组中的相应对象被传递给一个保存所选对象名称的工厂中的函数,然后调用$state.go
来更改路由。在新的路由上加载一个控制器加载相同的工厂并尝试访问保存的对象的名称。问题是,大约7次出10,它完美的作品,其他3次是给出“无法获取未定义或空引用属性名称”类型的错误。控制器未在UI路由器状态更改后从工厂加载值
这里是所选择的值传递给工厂控制器:
platformHome.controller('PlatformHome', ['$scope', 'appManager', '$state', function ($scope, appManager, $state) {
var SF = appManager.state.SF;
var SO = appManager.state.SO;
$scope.productLineSelected = function (product) {
setProductLine(product);
};
function setProductLine(product) {
SF.setProduct(product);
$state.go('metricDashboard');
}
}]);
这里是工厂:
applicationManager.factory('appStateManager', ['$rootScope', '$sessionStorage', '$state', function ($rootScope, $sessionStorage, $state) {
// STATE OBJECT CLASSES
//
var stateClasses = {};
stateClasses.ProductLine = function (name) {
this.name = name;
this.dashboard = {
mode: 'reporting', //reporting, analysis
modeView: 'canvas', //canvas, data
index: {
report: 0,
userReport: 0,
canvas: 0,
group: 0,
element: 0,
filter: 0,
}
};
this.reports = [];
this.canvases = [new stateClasses.Canvas];
};
// STATE DATA FUNCTIONS
//
var stateFunctions = {};
stateFunctions.setProduct = function (product) {
session.StateObject.productLine.current = product.Code;
session.StateObject[product.Code] = (typeof session.StateObject[product.Code] === 'undefined') ? new stateClasses.ProductLine(product.Name) : session.StateObject[product.Code];
};
// STUCTURE
//
var stateScope = $rootScope.$new(true);
var session = $sessionStorage;
session.StateObject = (typeof session.StateObject === 'undefined') ? new stateClasses.StateObject : session.StateObject;
stateScope.SO = session.StateObject;
stateScope.SF = stateFunctions;
return stateScope;
}]);
这里是控制器试图访问名称:
metricDashboard.controller('MetricDashboard', ['$scope', 'appManager', function ($scope, appManager) {
var SF = appManager.state.SF;
var SO = appManager.state.SO;
DSO = SO[SO.productLine.current];
$scope.name = DSO.name;
}]);
我怀疑问题与事情发生的顺序有关,但是,我不能f明确了为什么它的工作原理是7次的10次。
当我得到错误时,我能够确定第二个控制器中的行SO.productLine.current
的值为none
,这意味着它似乎没有已经从控制器的范围更新,但是,同时,我在工厂内部也使用console.log(JSON.stringify())
,工厂确实显示了适当的值而不是none
。
我也试过在$state.go
上使用$timeout
,并试图将它作为回调传递,但是这些都不能防止这个问题。代码再次7次,代码运行良好,名称属性值,但有时不是。