#angularjs #angular-ui-router #browserify
#angularjs #angular-ui-router #browserify
Вопрос:
Я никогда раньше не использовал Angular UI Router, но я хочу создать приложение с вложенными представлениями, чтобы оно выглядело как наиболее разумный выбор. Однако. Я просто не могу разобраться в этом. Мое приложение является модульным, поэтому на моей странице есть элемент, в который я хочу загрузить другие модули с их шаблонами просмотра.
Затем, когда внутри одного из вложенных представлений выполняется какое-либо действие, скажем, нажатие кнопки, я бы хотел, чтобы состояние изменилось, чтобы модуль стал единственным внутри основного представления, а URL-адрес изменился:
Я пишу на CoffeeScript и использую Browserify для объединения приложения, поэтому все модули находятся в отдельных файлах и требуются. Это то, чего я добился до сих пор, но это не работает, и я не могу в этом разобраться.
app.coffee
require...
require...
require...
app = angular.module("darrylsnow", [
"ngAnimate"
"ui.router"
"submodule1"
"submodule2"
"templates"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$locationProvider"
($stateProvider, $urlRouterProvider, $locationProvider) ->
$urlRouterProvider
.otherwise "/"
$stateProvider
.state "main",
abstract: true # because the main module requires the submodules
url: "/"
$locationProvider.html5Mode true
]
submodule1.coffee
submodule1 = angular.module("submodule1", [
"ui.router"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$routeProvider"
($stateProvider, $urlRouterProvider, $routeProvider) ->
$stateProvider
.state "main.submodule1",
url: ""
templateUrl: "submodule1.html"
.state "main.submodule1-expanded",
url: "/submodule1" # template shouldn't change
]
submodule2.coffee
submodule2 = angular.module("submodule2", [
"ui.router"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$routeProvider"
($stateProvider, $urlRouterProvider, $routeProvider) ->
$stateProvider
.state "main.submodule2",
url: ""
templateUrl: "submodule2.html"
.state "main.submodule2-expanded",
url: "/submodule2" # template shouldn't change
]
Возможно ли вообще иметь дочерние состояния в разных модулях? Если нет, как бы вы порекомендовали мне это сделать? Спасибо.
Ответ №1:
Есть рабочий пример, где я попытался показать, как собрать angular
ui-router
и coffee
вместе. Хотя я не уверен на 100%, чего именно вы пытались достичь… вы можете найти там некоторые ответы и вдохновение.
Во-первых (упрощенный) index.html
<head>
...
<script src="app.js"></script>
<script src="submodule1.js"></script>
<script src="submodule2.js"></script>
</head>
<body>
<ul>
<a ui-sref="main.submodule1.expanded">main.submodule1.expanded</a>
<a ui-sref="main.submodule2({id:22})">main.submodule2</a>
<a ui-sref="main.submodule2-expanded({id:22})">main.submodule2-expanded</a>
<div ui-view=""></div>
</body>
Теперь это будет app.coffee, где наиболее важной частью является template
. Это позволит каждому дочернему элементу вводить свой вид в этот шаблон безымянного представления. Другим вариантом было бы использовать абсолютно именованные представления, но это упрощает его:
app = angular.module("darrylsnow", [
"ui.router"
"submodule1"
"submodule2"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$locationProvider"
($stateProvider, $urlRouterProvider, $locationProvider) ->
$stateProvider
.state "main",
template: "<div ui-view />"
abstract: true # because the main module requires the submodules
url: "/"
...
Другие файлы представляют действительно разные модули.
Пример submodule1.coffeee
показывает, что даже здесь мы используем вложенность (main.submodule1.expanded является дочерним элементом main.submodule1):
submodule1 = angular.module("submodule1", [
"ui.router"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$locationProvider"
($stateProvider, $urlRouterProvider, $locationProvider) ->
$stateProvider
.state "main.submodule1",
template: "<div ui-view />"
abstract: true
.state "main.submodule1.expanded",
url: "/submodule1" # template shouldn't change
templateUrl: "submodule1.html"
controller: 'Some1Ctrl'
]
submodule1.controller 'Some1Ctrl', [
"$scope"
"$stateParams"
"$state"
($scope, $stateParams, $state) ->
$scope.params = $stateParams;
$scope.state = $state.current;
]
В качестве другого подхода мы можем использовать братьев и сестер в качестве подмодуля 2.coffee показывает:
submodule2 = angular.module("submodule2", [
"ui.router"
]).config [
"$stateProvider"
"$urlRouterProvider"
"$locationProvider"
($stateProvider, $urlRouterProvider, $locationProvider) ->
$stateProvider
.state "main.submodule2",
templateUrl: "submodule2.html"
controller: 'Some2Ctrl'
.state "main.submodule2-expanded",
url: "/submodule2/{id}" # template shouldn't change
templateUrl: "submodule2.html"
controller: 'Some2Ctrl'
...
То, как все это сочетается, лучше всего наблюдать в этом plunker