javascript-AngularJS:如何将长控制器拆分为模块?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-AngularJS:如何将长控制器拆分为模块?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3605字,纯文字阅读大概需要6分钟。
内容图文
构建我的第一个有角度的应用程序,我不明白如何将代码拆分为较小的块.我只有一个长期运行的控制器,但是如果我尝试将代码分成不同的部分(控制器,服务等),则数据突然不再与视图绑定(即,我更新数据,但是更改了在视图/浏览器中未显示).
即.我有一个简单的应用程序,该应用程序连接到api以获取“书籍”列表,然后显示该列表,并允许用户使用分页导航,或获取一本书的更多详细信息,或更新书籍记录(编辑/删除).
我想将功能拆分为单独的控制器,例如:
>搜索控制器:处理表单验证,将$http转换为api;
>书籍(列表):显示来自搜索API的结果;
>书籍(单个)控制器:书籍列表中的每个项目都是单个项目,并带有“更多详细信息”和“编辑/删除”之类的调用;
>分页控制器:用于翻阅书目清单的功能;
>消息控制器:在“搜索”,“书本”或“分页”控制器中执行操作时,显示成功/错误消息.
问题是我不知道该如何设置,因为如果我使用服务来存储/输出“ books”模型或“ messages”模型,那么当我通过其中一个控制器对该数据进行更新时,所做的更改不会不会自动更新视图(就像我更新链接到控制器的$scope变量时一样).
据我了解,视图中的$scope变量会自动更新,因为ng-controller =“ MyCtrl”已绑定到区域.但是,如何使用服务呢?您不使用ng-service标签,对吧?
假设我让searchController调用了api,并接收了所有书籍的json.我将其推入booksService进行存储.然后,负责更新页面上所有书籍的列表视图的我的booksController必须加载此booksService以获取新数据…但是如何知道数据已更新?如何通过booksController链接来自booksService的数据,以在视图中显示新结果?
而且,我将如何构造booksService -如何使searchController传递新数据(以更新可用于模型的持久变量),然后如何使booksController加载该新数据?我是否需要在booksService内创建调用以将新数据推入booksController,还是booksController应该从PullsService调用Pull新数据(如果是,它将如何知道何时应该进行PULL)?
同样,searchController和paginationController将使用与查询相同的API进行GET调用(唯一的不同是查询中的$page变量).我应该使用“服务”(还是工厂?)来解耦该$http.get请求?
最后,在文件夹/文件结构中构造所有这些控制器/服务的最佳方法是什么?我是否应该将每个块都分离到一个单独的* .js文件中?我应该使用require.js导入文件吗?在这种情况下,它是网站的单个页面(该网站上可能还有其他类似的页面).如果我将代码拆分为单独的文件,是否应将每个网页的文件归为一个文件夹? (即,如果我添加“用户仪表板”页面,则所有文件将存储在与“搜索书”页面不同的文件夹中).
抱歉,我知道我要问很多,但这确实可以帮助我确定正确构建Angular应用程序所涉及的概念.
解决方法:
以此方式将所有控制器放入controller.js文件.
angular.module('starter.controllers', [])
.controller('SearchCtrl', function($scope) {
//do your search stuff
})
.controller('BookCtrl',function($scope){
})
.controller('PaginationCtrl',function($scope){
})
.controller('MessagesCtrl',function($scope){
});
//in your services.js file
angular.module('starter.services', [])
/**
* A simple service that returns some data.
*/
.factory('Search', function() {
var somedata="from service";
return {
sample: function() {
return somedata;
}
}
)};
您可以从任何这样的控制器调用工厂服务
.controller('SearchCtrl', function($scope, Search) {
//get data from factory service
$scope.getdata=Search.sample();
})
也在您的指令文件中
/*
its route map for the application
all the page navigation are done here
common for the application
*/
angular.module('app',[
'ui.router'
])
.config(['$urlRouterProvider','$stateProvider',function($urlRouterProvider,$stateProvider){
$urlRouterProvider.otherwise('/');
$stateProvider
.state('home',{
url:'/',
templateUrl:'templates/home.html',
controller:'SearchCtrl'
})
.state('about',{
url:'/about',
templateUrl:'templates/about.html',
controller:'aboutCtrl'
})
}])
在home.html中,您可以通过这种方式读取数据
<h2>{{$scope.getdata}}</h2>
请查看此链接(http://ionicframework.com/getting-started/),然后尝试模拟基于标签页的应用程序工作的示例标签页应用程序.与angularjs配合使用Ionicframework对此类型的应用程序更好.
内容总结
以上是互联网集市为您收集整理的javascript-AngularJS:如何将长控制器拆分为模块?全部内容,希望文章能够帮你解决javascript-AngularJS:如何将长控制器拆分为模块?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。