你在哪里声明AngularJS中的对象?

时间:2014-03-08 00:23:12

标签: javascript angularjs

我有一个代表一个人的对象:

function Person(_name) {
    this.name = _name;

    this.start = function() {
        var that = this
        $timeout( function sayHello() {
            console.log(that.name);
            $timeout(sayHello, 1000);
        }, 1000);
    }
}

请注意,它使用了角度$timeout服务。我应该把它放在哪里,以便我可以在我的控制器中声明人员:

function Ctrl($scope) {

    // How do I access Person so I can do this?
    $scope.p1 = Person('nick');
    $scope.p2 = Person('amy');
    $scope.p1.start();
    $scope.p2.start();
}

我可以将声明放在控制器主体中,它可以工作,但这看起来不像是好的设计。我非常确定一个价值或提供商是专门为此而设的。但不确定如果依赖于$ timeout,它将如何工作。

2 个答案:

答案 0 :(得分:2)

您可以在工厂中创建对象

 var Person = (function (params) {
    angular.extend(this, params);

    return {
        name: params.name,
    };

});

Person.create = function create(params) {
    return new Person(params);
};

myApp.factory('Person', function ($timeout) {
    return Person;
});

然后在控制器中注入工厂并创建Person对象。

myApp.controller('HomeCtrl', function($scope, Person) {
    $scope.person = Person.create({ name: 'Andy' });
});

答案 1 :(得分:0)

我会使它成为一个返回构造函数的Service

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

myModule.service('Person', function($timeout) {
    // Actual person constructor defined once when
    // the service is first instantiated
    function Person(name) {
        this.name = name;

        this.start = function() {
            var that = this
            $timeout( function sayHello() {
                console.log(that.name);
                $timeout(sayHello, 1000);
            }, 1000);
        }                
    }

    this.create = function (name) {
        // Return a new instance
        return new Person(name);
    };
});

请注意,在这种情况下,您将使用Person.create()创建实例。