这是一个javascript方法或属性?

时间:2013-09-19 21:14:39

标签: javascript ember.js

我正在努力使我的术语正确。在以下代码中:

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把手助手?

6 个答案:

答案 0 :(得分:2)

它们是对象的所有属性,它们只有不同的类型。

在您的代码段中:

  • actions指向另一个Object
  • createNewNoteFunction对象(当分配给属性时,称为“方法”),
  • newNoteName目前只是对null的引用。

答案 1 :(得分:2)

之前的所有答案都是正确的,但是,它们都没有解决您问题中的Ember惯例。

newNoteNameNotesController的属性。在名为'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中设置的功能。