2015-01-12 3 views
1

Я пытаюсь включить дополнительные «модельные» объекты, которые полезны в моем приложении «Угловое». Предположим, у меня есть два отдельных файла javascript, как показано ниже. Я хотел бы добавить функцию «createStudent» к прототипу моего учителя и вызвать вызов метода конструктора ученика. Как может teacher.js правильно указать student.js? Какой метод для инъекции здесь?Значения модуля ввода в угловом

FYI, я знаю, что существует множество методов для включения моделей с богатыми объектами в Angular. Например, я не хочу идти по пути использования Restangular. Я хочу, чтобы это было очень просто на данный момент и, надеюсь, увеличило мое понимание угловых модулей.

Спасибо!

---------- teacher.js -----------

(function() { 
 

 
    var teacherConstructor = function() { 
 

 
     var teacher = { 
 
      student: [] 
 
     }; 
 
     
 
     return teacher; 
 

 
    }; 
 

 

 
    var module = angular.module("MyApp.models"); 
 
    module.value("teacber", teacberConstructor); 
 
}());

--------- - student.js

(function() { 
 

 
    var studentConstructor = function(theTeacher) { 
 

 
     var student = { 
 
      myTeacher: theTeacher 
 
     }; 
 
     
 
     return student; 
 

 
    }; 
 

 

 
    var module = angular.module("MyApp.models"); 
 
    module.value("student", studentConstructor); 
 
}());

ответ

2

Возможное решение - использовать factory:

(function() { 
    var module = angular.module("MyApp.models"); 

    module.factory("teacher", ["student", function(Student) { 
     var teacherConstructor = function() { 
      ... 
      var student = new Student(this); 
      ... 
     }; 

     return teacherConstructor; 
    }]); 
})(); 

Во всяком случае определение «класса» учителя должно быть сделано в функции определения угловых, за это, чтобы иметь возможность ссылаться на студента.

Это, однако, вводит ненужное закрытие. Я хотел бы предложить сбросив внешнюю функцию, в пользу родного пути ANGULAR в:

angular.module("MyApp.models").factory("Teacher", ["student", function(Student) { 
    var Teacher = function() { 
     ... 
     var student = new Student(this); 
     ... 
    }; 

    return Teacher; 
}]); 

Как Замечание, это обычное для «классов», чтобы начать с капиталом. то есть Student, Teacher. И конструктор может также иметь название класса, таким образом teacherConstructorTeacher в приведенном выше коде.

+0

Спасибо! Это освещает. Следующий вопрос: Я предполагаю, что только один из этих вызовов .factory() может вводить другой, иначе у меня будет циклическая зависимость. Поэтому я должен выбрать, создает ли Учитель новых учеников, или Студент создает своего учителя. Это правильно? И комментарий: Я пытался избежать использования «нового» ключевого слова в соответствии с книгой Крокфорда «Javascript: The Good Parts», потому что использование функции конструктора в отличие от нового Teacher() предлагает множество преимуществ, например, возможность принудительного использования частных и открытых функций на объекте. –

+0

Привет! О круглости: Да, вы правы - но это будет проблемой на любом языке. У вас все еще могут быть частные члены с оператором 'new', я, конечно, могу пропустить некоторые детали. Но наиболее продуктивным (IMO) является выбор стиля, который вам подходит, так что, без проблем с конструкторскими функциями. (Некоторые люди даже возражают, что полностью откажутся от логики OO и полностью перейдут в функционал с помощью Javascript :) –

+0

Угловая, кажется, поддается функциональному программированию, предоставляя сервисы, которые, насколько я вижу, прямолинейны. Я подумал о том, чтобы просто сгладить мой объектный граф в кучу эффективно статических функций, но не мог заставить себя это сделать. –

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