2016-08-09 4 views
1

Я хотел бы реализовать собственный пользовательский объект/классы в AngularJS. Тем не менее, я зацикливаюсь на концепции использования фабрик/сервисов в качестве пользовательских объектов - я понимаю, что фабрики и службы существуют для обеспечения бизнес-логики приложения, но могу ли я создать несколько заводов и сервисов в приложении? И если да, то что именно означает термин «singleton» (который многие из статей, которые я прочитал, описал как услуги)?Создание пользовательских объектов в AngularJS

Так, например, было бы это правильным и/или предпочтительным способом идти о создании базового объекта школы заполняется студентами объектов в AngularJS?

app.factory('schoolService',function(student){ 
    var school = {}; 
    school.students = []; 
    school.addStudent = function(){ 
     var newStudent = new student(); 
     this.students.push(newStudent); 
    } 
    return school; 
} 
app.service('student',function(){ 
    //anyway to toss in a constructor here? 
    this.name = 'name'; 
    this.getName = function(){ 
     return this.name; 
    } 
} 
app.controller('schoolCtrl',function(schoolService){ 
    schoolService.addStudent(); //obviously normally wouldn't do this, but for demonstration purposes 
    $scope.students = schoolService.students; 
    //expect $scope.students to equal an array of length 1, with one student object 
} 

заранее спасибо, и извините за все вложенные вопросы!

ответ

1

Singletons оставаться статичным. Контроллеры загружаются как они называются. Вы можете хранить студентов в службе, поскольку они будут сохраняться в течение срока действия вашего приложения и могут использоваться совместно с контроллерами.

https://jsfiddle.net/jtgd6tjn/

Угловые

function AppCtrl($scope, SchoolService) { 
    $scope.students = SchoolService.students; 
    $scope.addStudent = function() { 
    SchoolService.students.push($scope.newStudent); 
    $scope.newStudent = {}; 
    } 
} 

function SchoolService() { 
    var service = { 
    students: [] 
    }; 
    return service; 
} 

HTML

<div ng-app="myApp" ng-controller="AppCtrl"> 
    <form ng-submit="addStudent()"> 
    <input type="text" ng-model="newStudent.first"> 
    <br> 
    <input type="text" ng-model="newStudent.last"> 
    <br> 
    <button type="submit"> 
     Add New Student 
    </button> 
    </form> 
    <hr> 
    <ul> 
    <li ng-repeat="student in students"> {{ student.first}} {{ student.last }} </li> 
    </ul> 
</div> 
+0

Спасибо за ответ Робом, но где бы я определить объект студент, и как бы я впрыскивать его в сервис? Было бы так же просто, как определить var с объектом-учеником и использовать функцию SchoolService (student)? Благодаря! – Ted

+0

Вы говорите о новом студенте? – Rob

+0

Вид - В идеале я хотел бы сделать учеником класс, который имеет свои функции, данные и т. Д., Чтобы избежать захламления фабрики. Таким образом, $ scope.students и SchoolService.students, например, будут массивом объектов-учеников из студенческого класса. Я понимаю, что ваш пример будет работать для этой цели, но приложение, над которым я работаю в настоящее время, намного сложнее, и есть множество вычислений и данных, которые мне нужно хранить, которые не поступают непосредственно из пользовательского ввода. – Ted

0

Услуги/Заводы как вы упомянули, используются в качестве логических контейнеров. Они могут быть созданы один раз и введены в несколько контроллеров для выполнения бизнес-логики. Это помогает в повторном использовании кода и логической абстракции.

'Singleton' - это правильный способ определить, какие услуги есть. они инициализируются один раз, когда приложение загружается. В общих чертах вы можете использовать сервис как 'геттер и сеттер'. Если вы знакомы с кодированием, вы должны знать, что это значит.

И, насколько ваш упомянутый пример указан, службы не используются для создания объектов, подобных тому, как вы этого хотите. Для создания нового объекта в Javascript вы можете следовать подходу ниже.

var Student = function(name){ 
    this.name = name; 
}; 

var roy = new Student('Roy'); 

Надеюсь, это ответит на ваши вопросы. Вы можете прочитать больше об услуге/заводы в этом Blog

+0

Спасибо за ответ Akhil! Таким образом, объект, который я намереваюсь создать, довольно значителен и в идеале хотел бы написать его на моем заводе. Я просто определю объект вне приложения и передам его как зависимость? Благодаря! – Ted

0

на самом деле, когда вы инъекционного в контроллере service, объект службы уже инстанцирован так Угловая внутренне уже называют new на конструкторе службы. (Помните, что .service() - это просто конструктор)

Вы можете использовать .service и .factory по двум причинам. Да, они оба являются одиночными, но .factory может создавать несколько экземпляров.

«Это то, что делают фабрики, они создают новые объекты так, как вам хочется».

Используя .factory, он возвращает НИЧЕГО, что вы хотите.Ниже фабрика возвращает конструктор. Угловая просто кэширует то, что вы возвращаете для повторного использования.

function PersonService() { 
    function Person() { 
    this.foo = function() { 

    }; 
    } 
    Person.prototype.bar = function() { 

    }; 
    return Person; 
} 
angular 
    .module('app') 
    .factory('PersonService', PersonService); 

Тогда в некотором контроллере:.

function PersonController(PersonService) { 
    // new instance! 
    var newPerson = new PersonService(); 
    console.log(newPerson); 
} 

"[...] .Service(), по существу,„конечный результат“из .factory (вызову) .Service() дает нам возвращаемое значение, вызывая new в функции, которая может быть ограничена, тогда как .factory() является одним шагом перед этим процессом компиляции, когда мы выбираем, какой шаблон реализовать и вернуть ».

REF: https://toddmotto.com/factory-versus-service

 Смежные вопросы

  • Нет связанных вопросов^_^