0

在使用 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
}
}])
4

2 回答 2

3

虽然您想要做的事情可能有其他架构方法(例如,查看有关指令声明的范围属性的文档及其使用 @、= 和 & 在父范围中绑定特定属性的工具),但通常服务确实是一个共享对公共数据的访问的好选择。如果您没有在更新值时必须发生的额外逻辑,您可以稍微简化一下:

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
  });

});
于 2012-10-29T05:52:24.333 回答
0

您可以尝试这种方法,在该方法中创建一个触发点击滚动的指令。 普朗克

于 2014-09-02T08:32:19.550 回答