我正在尝试使用工厂提供的参数让角度 ui-router 导航到子状态,该参数在开始时具有默认参数,以便在整个应用程序中保留参数。
我希望默认主页和该链接在初始加载时转到工厂提供的默认动物,然后用户可以在从工厂保留的列表中选择动物时更新动物和参数,所以当他们导航回动物页面,它现在是他们选择的动物,具有所有动物参数而不是默认值。这样,如果他们说兽医页面,兽医页面可以检查所有选择的动物参数,当他们返回动物页面时,无论他们点击后退按钮还是动物链接,都是选择的动物。请原谅愚蠢的比喻。
应用程序.js:
angular.module('myApp, ['ui.router'])
.config(function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider
.when('zoo', ['animals', function(animals) {
$state.go('zoo.animals.animal', animals.Params);
}])
$stateProvider
.state('zoo', {
abstract: true,
url: '/zoo',
controller: 'ZooCtrl',
view: '<ui-view/>'
resolve: {
zoo: function(zoo) {
return zoo;
}
}
})
.state('zoo.animals', {
abstract: true,
url: '/animals',
view: '<ui-view/>'
controller: 'AnimalsCtrl'
})
.state('zoo.animals.animal', {
url: '/:animalId',
view: 'views/zoo.animals.animal.html'
})
})
动物.js
angular.module('myApp')
.factory('animals', ['zoo', function(zoo) {
var zoo = zoo;
var Default = {};
Default.animalId = 'sheep';
Default.color = 'black';
var Params = angular.copy(Default);
var animal;
return: {
Params: Params,
list: zoo.animals,
animal: animal
}
}])
zoo.js——工厂
angular.module('myApp')
.factory('zoo', ['$resource', function($resource) {
return $resouce('http://zoo.com/info', {
method: 'GET',
isArray: true
});
}])
zoo.js——控制器
angular.module('myApp')
.controller('ZooCtrl', ['$scope', 'animals','function($scope, zoo) {
$scope.animals = animals.list;
$scope.setAnimal = function(animal) {
animals.animal = animal;
animals.Params.animalId = animal.animalId;
}
}])
zoo.animals.animal.html
<h2>Default animal{{animal.name}}</h2>
<ul>
<li ng-repeat="animal in zoo.animals"><a ng-click="setAnimal(animal)" ui-sref="/zoo/animals/{{animal.animalId}}">animal.name</li>
</ul>
现在是否我使用这个 index.html
<a ui-sref="zoo">Animals</a>
<ui-view />
我得到一个“无法导航到抽象状态” - 很好。但是如果我尝试这个 index.html
<a ui-sref="zoo.animals.animal">Animals</a>
<ui-view />
然后它只是去
localhost:8000/myapp/#/zoo/animals
没有得到提供的animalId。或者,如果我离开它并返回它就消失了。我希望我想要完成的事情是有意义的。
编辑:更近一步!如果我将 index.html 链接更改为
<a href="#/zoo">Animals</a>
和 app.js when 属性为:
$urlprovider
.when('/zoo', ['$state', 'animals', function($state, animals){
$state.go('zoo.animals.animal', animals.Params);
}])
然后它确实导航到
localhost:8000/#/zoo/animals/sheep
或者
localhost:8000/#/zoo/animals/wolf
如果选择了 wolf,无论是使用后退箭头还是其他页面的 Animals 链接。或者如果刷新它会转到默认的动物(绵羊)页面。但现在如果你在
localhostL8000/#/zoo/animals/sheep
页面并单击它转到的动物链接
localhost:8000/#/zoo/animals
(还有另一个奇怪的情况,即数据已加载并在工厂中,但在从选择列表中选择之前不会显示。)