我很困惑,我将在角落中实例化对象

时间:2013-05-26 20:26:24

标签: javascript model-view-controller inheritance angularjs

我只是通过angularjs看了一下,它看起来很棒!但我对一些小事感到困惑。首先,我在哪里定义我想要实例化的对象,以及如何在那里获取它们?这看起来很模糊,所以这是一个例子

我有一个LogObject类,我的简单应用程序中的许多对象都来自这个类。我将它们扩展为Tasks,Notes,Events等。然后我有TaskController,以及一个处理任务存储和实例化的TaskModel。现在,我理解这样做的角度方法是使用TaskController,它利用TaskService进行存储和其他操作。但是我在哪里/什么声明Task对象?一个值?我可以只使LogObject成为一个值,并从中扩展吗?

PA.value('LogObject',function(){
  this.title;
  this.created = new Date();
  this.text;
  this.id;
});

PA.value('Task',function(LogObject){
  angular.extend(this,LogObject)
  this.due;
  this.etc;
  this.timeLeft = function(){
 //calculate time left 
}
});

修改

工厂为我想要的大部分工作做得很好,但我似乎无法正确扩建工厂 http://jsfiddle.net/22QLt/2/

2 个答案:

答案 0 :(得分:4)

您想使用Angular Factory:

http://docs.angularjs.org/guide/dev_guide.services.creating_services

var myModule = angular.module('myModule', []);
myModule.factory('serviceId', ['$http', function($http) {
  var items = [];
  return function(name) {
    var o = {name: name};
    items.push(o);
    return o;
  };
}]);

答案 1 :(得分:3)

您的fiddle存在一些问题,因此我稍微调整了一下以使其正常运行:updated fiddle

第一个问题是您的控制器未连接到您的模块。

我添加了一个正文标记:

<body ng-app='myapp'> ... </body>

将控制器声明更改为

app.controller("HelloCtrl", function($scope, Log, DueLog){ /*...*/ });

第二个问题是您使用angular.extend。它不是一种Backbone风格的扩展,可以为原型继承提供糖。它只是从对象复制到另一个。所以我编辑了你的工厂来手动实现原型继承。

以下是所有JS:

//angular.js example for factory inheritance
var app = angular.module('myApp', []);

app.factory('Log', function(){
    function Log(t) {
        this.title = t;
    }
    Log.prototype = {
        setTitle: function(t){
            this.title = t; 
            return this; // Returning the instance for chaining.
        }
    };
    return Log;
});

app.factory('DueLog', ['Log',function(Log){
    function DueLog(d) {
        Log.call(this);
        this.due = d;
    }
    DueLog.prototype = new Log();

    return DueLog;
}]);

app.controller('HelloCtrl', function($scope, Log, DueLog) {
    $scope.x = new Log("a").setTitle('x');
    $scope.y = new DueLog("tomorrow").setTitle('y');
});

希望这有助于您了解其中一些部分是如何组合在一起的。