Angularjs取决于父范围

时间:2012-10-28 11:45:21

标签: angularjs

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

2 个答案:

答案 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

相关问题