2016-08-08 82 views
0

我有从对象数组生成的网页上的图标列表。当用户点击一个图标时,数组中的相应对象被传递给一个保存所选对象名称的工厂中的函数,然后调用$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次,代码运行良好,名称属性值,但有时不是。

回答

0

我能够通过几个步骤纠正问题。这个想法是从MetricDashboard控制器中删除DSO变量的赋值,并将赋值功能移入工厂,然后仅将新分配的变量引用回控制器。

下面是变化:

工厂

... 

// 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]; 

     //new functionality for assignment 
     session.DynamicStateObject = session.StateObject[product.Code]; 
     stateScope.DSO = session.DynamicStateObject; 
}; 


// STUCTURE 
// 
var stateScope = $rootScope.$new(true); 

var session = $sessionStorage; 
session.StateObject = (typeof session.StateObject === 'undefined') ? new stateClasses.StateObject : session.StateObject; 

    //new structure to persist assignment beyond page refresh 
    session.DynamicStateObject = (typeof session.DynamicStateObject === 'undefined') ? {} : session.DynamicStateObject; 

    //new reference 
    stateScope.DSO = session.DynamicStateObject; 

stateScope.SO = session.StateObject; 
stateScope.SF = stateFunctions; 

return stateScope; 

在控制器

var SF = appManager.state.SF; 
var SO = appManager.state.SO; 

//Removed assignmnet 
//DSO = SO[SO.productLine.current]; 

//Added reference 
var DSO = appManager.state.DSO; 

$scope.name = DSO.name; 

虽然我还没有测试广泛的新的代码,我一直没能够重现错误。

相关问题