在使用AngularJs构建应用程序时,我问自己以下是否是好的做法
我有" AppController"而其他所有控制者都是它的孩子。 AppController就是这样的。
$scope.layout = { sidebar: false, searchbar: true};
现在,子控制器应该能够更改这些值:
$rootScope.sidebar = true;
在这种情况下,我的子模块完全依赖于根控制器,如果我希望这个子控制器在其他应用程序中运行,我必须确保该另一个应用程序的父控制器始终具有$ scope.layout对象。这是好习惯吗?构建父控制器和子控制器使用的布局模块会更好吗?代码如下:
angular.module("app.ui", [])
.factory("Layout", [function(){
var _sidebar = false;
var searchbar = true;
var sidebar = function(flag){
if(flag !== undefined) _sidebar = flag;
return _sidebar;
}
var searchbar = function(flag){
if(flag !== undefined) _searchbar = flag;
return _searchbar;
}
return {
sidebar : sidebar,
searchbar : searchbar
}
}])
答案 0 :(得分:3)
虽然可能有其他架构方法可以实现(例如,查看指令声明的 scope 属性的文档及其使用@绑定父作用域中特定属性的工具,通常,服务确实是共享公共数据访问的一个很好的选择。如果你没有在更新值时必须发生的额外逻辑,你可以稍微简化一下:
angular.module("app.ui", [])
.service("Layout", function() {
this.sidebar = false;
this.searchbar = true;
})
如果您将此服务注入您的控制器并将其添加到其范围,您可以更新它并监听这样的更改:
.controller("AppCtl", function($scope, Layout) {
$scope.Layout = Layout;
// Method called by a search button, say
$scope.search = function() {
Layout.searchbar = true;
}
$scope.$watch("Layout.searchbar", function(newVal, oldVal) {
// Do something in this scope if value has been changed from elsewhere
});
});
答案 1 :(得分:0)
您可以尝试使用此方法创建一个触发单击滚动的指令。 Plunker