javascript - 使用 Object.create() 的 Angular 服务继承

标签 javascript angularjs oop inheritance factory

我正在尝试在 Angular 服务中使用继承,如下所述: http://blog.mgechev.com/2013/12/18/inheritance-services-controllers-in-angularjs/ ,我想使用“注入(inject)父级”方法。

但是,它似乎不起作用,我不明白为什么。

var myApp = angular.module('myApp',[]);

angular.module('myApp').controller('MyCtrl', MyCtrl);
angular.module('myApp').factory('BaseModel', BaseModel);
angular.module('myApp').factory('ThreadModel', ThreadModel);
angular.module('myApp').factory('PostModel', PostModel);

function MyCtrl($scope, ThreadModel, PostModel) {
  $scope.tableNameForThreads = ThreadModel.getTableName();
  $scope.tableNameForPosts = PostModel.getTableName();
}

function BaseModel() {
  var tableName = "";

  var service = {
    init: init,
    getTableName: getTableName
  };

  return service;

  function getTableName() {
    return tableName;
  }

  function init(theTableName) {
    tableName = theTableName;
  }
}

function ThreadModel(BaseModel) {
  var service = Object.create(BaseModel);
  service.init("threads");
  return service;
}

function PostModel(BaseModel) {
  var service = Object.create(BaseModel);
  service.init("posts");
  return service;
}

结果是 ThreadModel.getTableName() 返回“posts”而不是“threads”。

我尝试了 Object.create(...)angular.copy(BaseModel, this),但两者似乎都没有进行深度复制。

JSFIDDLE:http://jsfiddle.net/dirkpostma/Lvc0u55v/3989/

我在这里做错了什么?

最佳答案

问题是这个设置使用 Object.create您使用 tableName 提供服务存储在同一个公共(public)闭包中的变量(BaseModel 函数)。简单来说,init方法修改相同 local tableName变量。

你可以这样修复它:

function BaseModel() {

  var service = {
    init: init,
    getTableName: getTableName
  };

  return service;

  function getTableName() {
    return this._tableName;
  }

  function init(theTableName) {
    this._tableName = theTableName;
  }
}

请注意,getTableNameinit方法现在使用实例属性 this._tableName TableModel 之间不共享和 PostModel实例。

演示: http://jsfiddle.net/Lvc0u55v/3991/

关于javascript - 使用 Object.create() 的 Angular 服务继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37224635/

相关文章:

javascript - jQuery 选择框未关闭

javascript - 我如何响应 React 中自动调整大小的 DOM 元素的宽度?

javascript - 如何从多个文本框中获取输入

javascript - 将函数绑定(bind)到事件后使用 "this"访问对象本身

javascript - 使用脚本中的 html 打开浏览器窗口

javascript - 找不到 react 组件 LoginComponent - ng-React

javascript - angularjs日期选择器实现错误

javascript - AngularJS 与 Highcharts 不带 JQuery

c# - main 之前的静态初始化

javascript - Javascript 将对象方法映射到数组中的对象?