2016-09-08 97 views
2

我一直在尝试和搜索关于此的文章,以及我发现在运行时仅动态添加状态。最接近我找到的解决方案是使用deferIntercept,$urlRouter.sync()$urlRouter.listen()。但是,$urlRouter似乎只能在运行时使用(在控制器用户操作之前运行)。在控制器中添加路由

这个plunker显示工作动态添加状态到运行时但挑战是在控制器中实现它。

下面是我想要实现的说明。我一直在这个问题上挣扎数周。希望有人能给我一些关于如何实现愿望结果的暗示。

// Predefined state in config 
$stateProvider.state('default', { 
    url: '', 
    templateUrl: '', 
}) 

// Predefined state in config 
$stateProvider.state('home', { 
    url: '', 
    templateUrl: '', 
}) 

// Additional Added state in controller when user click button 
$scope.clickButton = function() { 
    $stateProvider.state('newpage', { 
     url: '', 
     templateUrl: '' 
    }) 
}; 
+0

有你有充分回答(s)http://stackoverflow.com/q/24727042/1679310。它们涵盖了启动场景(从服务器数据配置状态)并在运行时添加新的状态... –

+0

检查这可能有助于http://stackoverflow.com/questions/25866387/angular-ui-router-programmatically-add-states/31478967 – nmanikiran

+0

@RadimKöhler感谢您的评论,我也通读了问题和答案。但是我想在控制器用户操作中添加新的状态,而不是在运行时。 – stackdisplay

回答

2

我更新了你的代码一点点:http://plnkr.co/edit/wDVf2S?p=preview

我加入点击回调和2个阵列控制器,我NG-重复打印的index.html

app.controller('mainCtrl', mainCtrl); 

mainCtrl.$inject = ['$urlRouter']; 
function mainCtrl ($urlRouter) { 
    var vm = this; 

    // 'add new state' button click function 
    vm.addState = function() { 
    var name = 'new-state-' + (vm.hrefs.length - 2); 
    var newState = { 
     "url": "/" + name, 
     "abstract": false, 
     "parent": "", 
     "views": {} 
    }; 
    // add views 
    newState.views[name] = { 
     "name": name, 
     "template": "<div style='padding:20px; border: solid 1px red; margin-bottom: 15px;'>TEMPLATE FOR <em>" + name.toUpperCase() + "</em> GOES HERE</div>" 
    }; 
    newState.views["[email protected]"] = { 
     "name": "[email protected]", 
     "templateUrl": "tpl.content.html" 
    }; 
    newState.views["[email protected]"] = { 
     "name": "[email protected]", 
     "templateUrl": "tpl.left.html" 
    }; 

    $stateProviderRef.state(name, newState); 

    vm.hrefs.push(name); 
    // add to the head 
    vm.views.reverse().push(name); 
    vm.views.reverse() 

    $urlRouter.sync(); 
    $urlRouter.listen(); 
    }; 

    vm.hrefs = ['home', 'other', 'about']; 
    vm.views = ['', 'header', 'left', 'container', 'footer']; 
} 
+0

无论对OP有帮助还是不对,这仍然是一些很棒的东西。 – TSmith

+0

我更新了我的plunker,添加了从JSON文件加载状态以及添加新状态按钮的按钮。这两个操作都是从控制器执行的。 – Andriy