我正在努力使我的术语正确。在以下代码中:
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:','actions:'和'createNewNote:'?
他们是方法或属性还是钩子?有什么区别?并且'createNewNote'是否嵌套在'actions:'中使'action'完全不同?
您创建并为自己命名的ember'clooks'和方法/属性之间有什么区别?它们是如何使用的?
谢谢。'
[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 :(得分:2)
它们是对象的所有属性,它们只有不同的类型。
在您的代码段中:
actions
指向另一个Object
,createNewNote
是Function
对象(当分配给属性时,称为“方法”),newNoteName
目前只是对null
的引用。答案 1 :(得分: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');
}
}
});
[更新]:解决有关挂钩的问题。
在Ember中,钩子是您可以在对象上创建的函数,Ember将在各个点调用它们来管理对象层次结构和生命周期。例如,在Route
中,您经常需要实现model
挂钩。如果您在model
中声明了一个名为Route
的函数,那么当它需要获取该路由所代表的模型时,Ember将自动调用该方法。这允许您覆盖Ember查找模型的默认方式,而无需实现Ember在路径/控制器创建和设置方面所做的所有事情。 Hook方法在技术上与您在对象上实现的其他方法没有什么不同,唯一真正的区别是Ember会在适当的时候自动调用钩子方法。
[更新2]:'content'
来自哪里?
content
是控制器所代表的对象。路由在控制器上设置content
,并从model
挂钩中检索。 Ember内置了一些智能默认值,可以根据您的Router
尝试做正确的事情。但是你可以实现model
钩子来返回你想要的任何东西。
如果您还没有自己创建Notes.NotesRoute
,那么Ember会为您生成一个或多或少与此相同的内容:
Notes.NotesRoute = Ember.Route.extend({
model : function(){
return this.store.find('note');
}
});
该控制器正在查找所有Note
模型,并将该集合设置为content
的{{1}}属性。
答案 2 :(得分:1)
我不是JS专家,所以希望我的术语能够处于正确的水平......
基本上所有的JS都归结为函数和对象。在任何地方,您看到{..}都有一个对象,因为这称为对象文字表示法。
对象具有属性,其值可以是从null到其他对象(字符串等)到函数的任何值。
函数接受参数,可以是其他函数或对象。
因此,extend和createNewNote是函数,传递给extend函数的参数是一个对象,action属性的值是一个对象。
答案 3 :(得分:0)
“newNoteName”是一个属性。 “行动”是一种财产。 “createNewNote”是一种方法。
建议您查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
答案 4 :(得分:0)
它们都是属性或“名称”。
思考JSON有助于更好地了解正在发生的事情。
考虑一下你有一个对象。您可以通过为其指定名称来设置此对象的属性。您可以为此属性分配一个值,该值可以是对象,字符串,数组,函数等。
var myObject = { propertyName : propertyValue }
答案 5 :(得分:0)
newNoteName
是一个属性,等于null
。
actions
是一个属性,包含一个文字对象。
在匿名对象中,createNewNote
是由匿名函数定义的方法。它不仅仅是一个设置为函数的属性,因为它会评估函数的结果。要调用此方法,您可以使用:
Notes.NotesController.actions.createNewNote();
这将执行createNewNote中设置的功能。