2013-09-19 3 views
3

У меня самое трудное время, когда я получаю свою терминологию. В следующем коде:Это метод или свойство javascript?

Notes.NotesController = Ember.ArrayController.extend({ 
    newNoteName: null, 

    actions: { 
    createNewNote: function() { 
     var content = this.get('content'); 
     var newNoteName = this.get('newNoteName'); 
     var unique = newNoteName != null && newNoteName.length > 1; 

     content.forEach(function(note) { 
      if (newNoteName === note.get('name')) { 
      unique = false; return; 
      } 
     }); 

     if (unique) { 
      var newNote = this.store.createRecord('note'); 
      newNote.set('id', newNoteName); 
      newNote.set('name', newNoteName); 
      newNote.save(); 

      this.set('newNoteName', null); 
      } else { 
      alert('Note must have a unique name of at least 2 characters!'); 
     } 
    } 
    } 
}); 

Что такое 'newNoteName:', 'действия:', и 'createNewNote:'?

Это методы или свойства или крючки? Каковы различия? И делает ли «createNewNote» вложенным внутри «действий»: сделать «действия» чем-то совсем другим?

В чем разница между «крючками» ember и методами/свойствами, которые вы создаете, и называете себя и как они используются?

Спасибо. '

[UPDATE]

Где 'содержание' взялось?

Notes.NotesNoteController = Ember.ObjectController.extend({ 
actions: { 
    updateNote: function() { 
     var content = this.get('content'); 
     console.log(content); 
     if (content) { 
      content.save(); 
     } 
    } 
} 
}); 

Это не является атрибутом модели, так как же Ember знает, что получить с

this.get('content') 

Он приходит с помощником textArea руле?

+0

Я скорее рассматриваю их как пары ключ/значение, такие же, как в формате JSON. – Lyth

ответ

2

Все предыдущие ответы верны, однако ни один из них не обращается к соглашениям Ember при игре в вашем вопросе.

newNoteName является собственностью NotesController. Внутри шаблона 'notes' вы можете отобразить его с помощью {{newNoteName}} или использовать его во входном файле с {{input value=newNoteName}}. В NotesController вы можете прочитать значение с помощью this.get('newNoteName'), и вы можете установить значение с помощью this.set('newNoteName').

actions - специальное свойство на контроллерах Ember. Любые функции, объявленные в хеше actions, могут быть вызваны в шаблоне. Использование createNewNote в качестве примера, вы можете использовать что-то вроде этого, чтобы вызвать функцию в ответ на нажатие кнопки:

<button {{action 'createNewNote'}}>Create New Note</button> 

createNewNote это действие контроллера. Его можно вызывать из шаблона, как показано выше, или его можно вызвать из других контроллеров или представлений, используя send.

С другого контроллера вы можете иметь это:

Notes.OtherController = Ember.Controller.extend({ 
    needs : ["notes"], 
    actions : { 
    someAction : function(){ 
     this.get('controllers.notes').send('createNewNote'); 
    } 
    } 
}); 

[UPDATE]: Решение вопроса о крючках.

В Ember hooks - это функции, которые вы можете создавать на своих объектах, которые Ember будет вызывать в разных точках, поскольку он управляет вашей иерархией объектов и жизненным циклом. Например, в Route вы часто захотите реализовать крючок model. Если вы объявили функцию с именем model в Route, то Ember автоматически вызовет этот метод, когда ему нужно будет удержать модель, которая должна быть представлена ​​этим маршрутом. Это позволяет вам переопределить способ по умолчанию, который Ember ищет для модели, не требуя также реализации всех вещей, которые делает Ember в способе создания и настройки Route/Controller.Методы крюка действительно технически ничем не отличаются от других методов, которые вы можете реализовать на своих объектах, единственное реальное различие заключается в том, что Ember автоматически вызовет методы hook в соответствующее время.

[ОБНОВЛЕНИЕ 2]: Откуда 'content'?

content - объект, который представляет ваш контроллер. Маршрут устанавливает content на контроллере, и он извлекается из крюка model. У Ember есть встроенные встроенные встроенные встроенные функции, которые будут пытаться делать правильные вещи на основе вашего Router. Но вы можете реализовать крючок model, чтобы вернуть все, что захотите.

Если вы не создали Notes.NotesRoute себя, то угасающий генерирует для вас, что более или менее эквивалентно следующему:

Notes.NotesRoute = Ember.Route.extend({ 
    model : function(){ 
    return this.store.find('note'); 
    } 
}); 

Этот контроллер находит все Note модели и установки, что сбор в content свойство NotesController.

+0

Большое спасибо! Это очень помогает. Знаете ли вы о каких-либо других источниках, которые объясняют это более подробно? – reknirt

+0

Гиды Ember, вероятно, лучший ресурс. http://emberjs.com/guides/ Я только понял, что пропустил ваш вопрос о крючках. Я собираюсь добавить [UPDATE] к моему ответу. –

+0

Удивительный! Спасибо. Я ценю вашу помощь. – reknirt

0

Они все свойства или «имена».

Мышление JSON помогает лучше понять, что происходит.

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

var myObject = { propertyName : propertyValue } 
0

newNoteName является свойство, равное null.

actions - это свойство, содержащее буквальный объект.

Внутри этого анонимного объекта createNewNote - это метод, определенный анонимной функцией. Это не просто свойство, установленное для функции, потому что это будет оценивать результат функции. Чтобы позвонить по этому методу, вы должны использовать это:

Notes.NotesController.actions.createNewNote(); 

Это выполнит функцию, установленную в createNewNote.

+0

Я не знаком с Ember.js, поэтому функцию можно вызвать другим способом. –

2

Это все свойства объекта, у них просто разные типы.

В фрагменте кода:

  • actions указывает на другой Object,
  • createNewNote является Function объект (который, когда присваивается свойству, называется "метод"), и
  • newNoteName - всего лишь ссылка на null, на данный момент.
1

Я не эксперт JS так что надеюсь, моя терминология будет на должном уровне ...

По существу все JS сводится к функциям и объектам. В любом месте, где вы видите {..}, у вас есть объект, так как это называется Object Literal Notation.

Объекты имеют свойства, значения которых могут быть любыми от нуля до других объектов (строк и т. Д.) До функций.

Функции принимают аргументы, которые могут быть другими функциями или объектами.

Таким образом, extend и createNewNote являются функциями, а аргумент, переданный в функцию extend, является объектом, а значением свойства action является объект.

+0

Функции - это только объекты 'Function'. (Почти) все в JavaScript - это объект. –

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