过去一周我一直在学习Angular,并着眼于在我的项目中使用它。该项目是一个食品订购网站。
页眉和页脚对所有页面/状态都是通用的。顶部导航是从类别列表生成的(见下文)。标题还将保存购物车图标和摘要,并在登录时显示用户的姓名。
产品层次结构中有三个级别:
该应用程序具有以下主要状态:
现在,我的问题是在状态结构中组织所有这些。
我已经提出了具有命名视图的状态层次结构,但我的主要问题是将各种视图中的数据连接在一起。例如,标题视图位于根状态,因为它对所有状态都是通用的。但是这个视图需要访问几个数据片段,其中一些只能用于其他视图:
所以问题是,创建包含所有这些数据的存储库的最佳方法是什么?
应该可以从标题访问它,也可以从其他视图访问它。我发现的解决方案在我看来更像是黑客而不是正确的解决方案(例如为了将数据传递给父状态而引发事件等)。
我也对整个应用程序的整体组织建议持开放态度。我正在学习,所以我已经准备好抓住一切并重新开始。我希望能够确保我正在使用最好的方法完成任务。现在我觉得很古怪。
所以这就是我到目前为止所做的事情: *注意:我将默认的{{}} Angular表达式分隔符更改为{[{}}},因为我还使用了Laravel刀片。
的index.html:
<!doctype html>
<html ng-app="app">
<head></head>
<body>
<div class="container">
<div ui-view="header"></div>
</div> <!-- /container -->
<div class="container" ui-view="content"></div>
<div class="container">
<footer></footer>
</div> <!-- /container -->
</body>
</html>
app.js:
var app = angular.module('app', ['ui.router', 'ngResource'], function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
})
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('root', {
abstract: true,
resolve: {
// A string value resolves to a service
Config: 'Config',
// A function value resolves to the return
// value of the function
config: function(Config){
return Config.query().$promise;
}
},
views: {
"header": {
templateUrl: "/partials/header.html",
controller: function($scope, config, $stateParams){
// You can be sure that promiseObj is ready to use!
$scope.catsSubcats = config;
$scope.catId = $stateParams.catId;
$scope.getActiveClass = function (ccsubId,catId) {
console.log(ccsubId);
if (ccsubId == catId) return 'active'; else return '';
}
}
}
}
})
.state('root.home', {
url:'/home',
views: {
"content@": {
templateUrl: "/partials/home-content.html"
}
}
})
.state('root.cat', {
url:'/cat/:catId',
resolve: {
// Inject the config resolved in the main state
// and extract the data we need
data: function(config){
return config;
}
},
views: {
"content@": {
templateUrl: "/partials/cat.html"
},
"sidebar@root.cat": {
templateUrl: "/partials/cat-sidebar.html",
controller: "CatSidebarCtrl"
},
"content@root.cat": {
templateUrl: "/partials/cat-content.html",
controller: "CatContentCtrl"
}
}
})
.state('root/subcat/:subcatId', {
url:'/subcat/:subcatId',
templateUrl:'partials/subcat.html'
})
})
app.controller ('CatSidebarCtrl',
function($scope , $stateParams, data ) {
var id = $stateParams.catId;
$scope.catId = id;
//let's get the subcats for the current cat from the cats-subcats Json
var index;
var subcats;
for (index = 0; index < data.length; ++index) {
if ( data[index].id==id ) subcats = data[index].subcats;
}
$scope.subcats = subcats;
}
);
app.controller ('CatContentCtrl',
function($scope , $stateParams, data ) {
var id = $stateParams.catId;
$scope.sidebar = id;
$scope.ccats = data;
}
);
app.factory("Config", function($resource) {
return $resource("/api/cats-subcats");
});
cat.html:
<div class="row">
<div class="col-sm-5 col-md-3 sidebar" ui-view="sidebar"></div>
<div class="col-sm-7 col-md-9 main" ui-view="content"></div>
</div> <!-- row -->
猫sidebar.html:
<ul class="nav nav-sidebar">
<li ng-repeat="sub in subcats"><a href="#">{[{ sub.name }]}</a></li>
</ul>
cat-content.html - 目前尚未完成