javascript - 有没有办法让子 Controller 从其父 Controller 继承服务 "like"实例?

标签 javascript angularjs angularjs-controller

在我的应用程序中,我有窗口实例。应用程序可以包含多个窗口,窗口可以包含多个 View 。这些 View 是每个窗口实例的子级。

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

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

我希望能够从 View 更新窗口。但我只希望 children 能够更新他们的父窗口。由于服务是单例,因此 View 将更新所有窗口。

有没有办法在不传递某种 ID 的情况下实现这一点?

最佳答案

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

以下是利用这一事实的服务的框架示例:

.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,因为 View 对象将包含对其父窗口的引用。事实上,如果所有 ViewController 都有一个 WindowController 父级,您可以通过原型(prototype)继承引用该范围变量,通过 $scope.window 从view,绕过 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

关于javascript - 有没有办法让子 Controller 从其父 Controller 继承服务 "like"实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964571/

相关文章:

javascript - 如何使用正则表达式从句子中删除特定字符串?

javascript - 以整小时增量创建选择列表

angularjs - 使用 TypeScript : TS2304: Cannot find name 'module' 的 Angular 单元测试

javascript - Angularjs 1.x Controller 在指令中没有响应

angularjs - 等待设置ng-init值的正确方法是什么?

javascript - 在 html2canvas 事件中设置隐藏字段的值

javascript - Odometer.js 无法在 Meteor 中运行?

javascript - Angular 链接函数中作用域变量的范围是多少?

angularjs - 获取子 Controller 中的父 Controller ,所有子 Controller 都使用 'controller as vm' 表示法

javascript - HTML5 中的 Canvas : Removing Previous Rectangle