AngularJS: 从布局更新视图内容

AngularJS: Update view content from layout

你可以在下图中看到我正在尝试做什么。

页面上主要有两个部分。页眉部分包含一个公共菜单和一个搜索文本框。

当用户单击菜单(例如电影)时,Movies.html 视图将加载到标有 ng-view 的部分。

每个视图都有自己的控制器,定义如下:

$routeProvider
    .when("/", { templateUrl: "app/albums.html", controller: "albumController" })
    .when("/games", { templateUrl: "app/games.html", controller: "gamesController" })...etc

到目前为止一切顺利。这个想法是,当用户在文本框中搜索内容时,当前视图将被更新。

我可以用一个 commonController 包装 searchTextbox HTML 但是...我如何从这个控制器更新当前加载视图的 $scope?

实现该目标的最佳方法是什么?

谢谢大家

我认为你应该使用 service

您的 commonController 将通知此服务:

commonController.$inject = ['NotifyViewFactory'];
function commonController(NotifyViewFactory){
  var vm = this;
  vm.inputModel = '';

  this.notifyService = function(){
    NotifyViewFactory.setValue(vm.inputModel); 
  };

  //may be in your example better to listen when route changed:
  //and then use service
  $scope.$on('$routeChangeSuccess', function(scope, next, current){
    NotifyViewFactory.setValue(vm.inputModel);
  });
}

工厂看起来像这样:

NotifyViewFactory.$inject = ['$rootScope'];
function NotifyViewFactory($rootScope){
  return {
    setValue: setValue
  };

  function setValue(data){
    //do something with data if necessary
    $rootScope.$emit('inputUpdated', data);
  }
}

和视图控制器:

viewController.$inject = ['$rootScope', '$scope'];
function viewController($rootScope, $scope){
  $rootScope.$on('inputUpdated',function(event, data){
    $scope.someValue = data.someValue;
  });
}

因此,来自 commonController 的数据可以传递给 viewController 而无需任何更改,或者如果您需要一些更改- 您可以在 NotifyViewFactorysetValue 方法中执行此操作(在 $rootScope.$emit 调用之前)。

最简单的解决方案是使用可跨控制器访问的 $scope 变量。

在您的 header 控制器中定义:

'$scope.global = {};'

然后将搜索值赋给那个object,如:

'$scope.global.searchValue = "Ready Player One"'

然后您就可以在其他控制器中访问该变量,而无需经历使用服务的所有复杂过程。