有没有办法让子控制器继承服务"喜欢"来自其父母的实例?

时间:2014-05-30 23:02:24

标签: javascript angularjs angularjs-controller

在我的应用程序中,我有窗口实例。该应用程序可以包含多个窗口,窗口可以包含多个视图。视图是每个窗口实例的子视图。

function windowController($scope, WindowService) {
    WindowService.setWindowConfig($scope.window);
}

function viewController($scope, WindowService) {
    WindowService.updateDirtyState(true);
}

我希望能够从视图中更新窗口。但我只希望孩子们能够更新他们的父窗口。由于服务是单身,视图将更新所有窗口。

有没有办法在不传递某种身份证的情况下实现这一目标?

1 个答案:

答案 0 :(得分:1)

服务单例,但它们可以包含除了它们返回的对象之外的对象的构造函数。

以下是利用此事实的服务的骨架示例:

.factory('WindowService', function(){
  var service = {};

  var Window = function() {
    ...
  };

  Window.prototype.doSomething = function(){
    ...
  };

  var View = function(window) {
    this.window = window;
  };

  service.newWindow = function(){
    return new Window();
  }

  service.newView = function(){
    return new View(window);
  }

  return service;
});

假设每个ViewController都有自己的WindowController父级,可以通过以下方式实例化它们:

.controller('WindowController', function($scope, WindowService){
  $scope.window = WindowService.newWindow();
})
.controller('ViewController', function($scope, WindowService){
  $scope.view = WindowService.newView($scope.window);
})

没有理由担心id,因为视图对象将包含对其父窗口的引用。实际上,如果所有ViewController都有一个WindowController父项,您可以通过原型继承引用该范围变量,从视图中通过$scope.window,绕过WindowService进行窗口对象访问

.controller('ViewController', function($scope, WindowService){
    $scope.view = WindowService.newView($scope.window);
    // don't need to do $scope.view.window.doSomething(), but you could
    $scope.window.doSomething();
})

Demo