Angularjs取决于父范围

Angularjs取决于父范围,angularjs,Angularjs,在使用AngularJs构建应用程序时,我问自己以下是好的做法吗 我有“AppController”,其他所有控制器都是它的子控制器。AppController有类似的功能 $scope.layout = { sidebar: false, searchbar: true}; 现在,子控制器应该能够更改这些值: $rootScope.sidebar = true; 在这种情况下,我的子模块完全依赖于根控制器,如果我希望此子控制器在其他应用程序中工作,我必须确保其他应用程序的父控制器始终具有

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

虽然可能有其他体系结构方法来实现您的目标(例如,查看有关指令声明的作用域属性的文档及其使用@、=和&来绑定父作用域中特定属性的工具),但通常来说,服务确实是共享对公共数据访问的一个好选择。如果没有更新值时必须发生的额外逻辑,则可以将其简化一点:

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

});

虽然可能有其他体系结构方法来实现您的目标(例如,查看有关指令声明的作用域属性的文档及其使用@、=和&来绑定父作用域中特定属性的工具),但通常来说,服务确实是共享对公共数据访问的一个好选择。如果没有更新值时必须发生的额外逻辑,则可以将其简化一点:

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

});

您可以尝试这种方法,创建一个指令,在单击时触发滚动。

您可以尝试这种方法,创建一个指令,在单击时触发滚动。

如果您想构建模块化和自适应的应用程序,我建议您尝试directive controller。它们有自己的作用域,您可以在几乎所有上下文中重用它们。我认为第二种选择更好,使用服务来构建全局变量。请执行您认为最容易维护的操作。OP中建议的每个实现都很好。如果您想构建非常模块化和自适应的应用程序,我建议您尝试directive controller。它们有自己的作用域,您可以在几乎所有上下文中重用它们。我认为第二种选择更好,使用服务来构建全局变量。请执行您认为最容易维护的操作。OP中提出的每个实现都很好。我使用了Tim解决方案。不确定是否应该将其标记为答案,因为有很多解决方案,我只是使用了这个?我使用了Tim解决方案。不确定是否应该将其标记为答案,因为有很多解决方案,我只是使用了这个?