3

我很难正确使用我的术语。在以下代码中:

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:' 中是否使 'actions' 完全不同?

ember“钩子”和您自己创建和命名的方法/属性以及它们的使用方式有什么区别?

谢谢。'

[更新]

“内容”从何而来?

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

4

6 回答 6

2

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

在您的代码段中:

  • actions指向另一个Object
  • createNewNote是一个Function对象(当分配给一个属性时,它被称为“方法”),并且
  • newNoteName目前只是一个参考null
于 2013-09-19T21:25:18.257 回答
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在 a 中调用的函数Route,然后当 Ember 需要获取要由该路由表示的模型时,它会自动调用该方法。这允许您覆盖 Ember 查找模型的默认方式,而无需实现 Ember 在创建和设置路由/控制器时所做的所有事情。Hook 方法在技术上与您可以在对象上实现的其他方法实际上并没有什么不同,唯一真正的区别是 Ember 会在适当的时候自动调用 hook 方法。

[更新 2]:'content'从哪里来?

content是您的控制器所代表的对象。路由content在控制器上设置,并从model钩子中检索。Ember 内置了一些智能默认设置,它们会尝试根据您的Router. 但是您可以实现model挂钩以返回您想要的任何内容。

如果您还没有创建Notes.NotesRoute自己,那么 Ember 正在为您生成一个或多或少等同于此的:

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

该控制器正在查找所有Note模型并将该集合设置contentNotesController.

于 2013-09-20T05:14:27.130 回答
1

我不是 JS 专家,所以希望我的术语能达到正确的水平......

基本上所有的 JS 都归结为函数和对象。任何你看到 {..} 的地方都有一个对象,因为这被称为对象文字表示法。

对象具有属性,其值可以是从 null 到其他对象(字符串等)再到函数的任何值。

函数接受参数,可以是其他函数或对象。

所以,extend和createNewNote都是函数,传入extend函数的参数是对象,action属性的值是对象。

于 2013-09-19T21:25:43.167 回答
0

“newNoteName”是一个属性。“动作”是一个属性。“createNewNote”是一种方法。

建议你看看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

于 2013-09-19T21:19:53.083 回答
0

它们都是属性或“名称”。

思考 JSON 有助于更好地理解正在发生的事情。

只要考虑你有一个对象。您可以通过给它们命名来设置该对象的属性。您可以为该属性分配一个值,该值可以是对象、字符串、数组、函数等。

var myObject = { propertyName : propertyValue }
于 2013-09-19T21:22:58.970 回答
0

newNoteName是一个属性,等于null

actions是一个属性,包含一个文字对象。

在该匿名对象内部,createNewNote是一个由匿名函数定义的方法。它不仅仅是为函数设置的属性,因为它会评估函数的结果。要调用此方法,您将使用以下命令:

Notes.NotesController.actions.createNewNote();

这将执行 createNewNote 中设置的函数。

于 2013-09-19T21:25:11.337 回答