javascript - 这是一个 javascript 方法还是属性?

标签 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:”?

它们是方法、属性还是钩子(Hook)?有什么区别? “createNewNote”嵌套在“actions:”中是否会使“actions”完全不同?

您创建并命名的 ember“ Hook ”和方法/属性之间有何区别以及它们的使用方式?

谢谢。'

[更新]

“内容”从何而来?

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

最佳答案

之前的所有答案都是正确的,但是,它们都没有解决您问题中起作用的 Ember 约定。

newNoteNameNotesController 的属性。在名为 'notes' 的模板中,您可以使用 {{newNoteName}} 显示它,或使用 {{input value=newNoteName}} 在输入中使用它。在 NotesController 中,您可以使用 this.get('newNoteName') 读取值,并且可以使用 this.set('newNoteName')< 设置值.

actions 是 Ember Controller 的一个特殊属性。在 actions 散列中声明的任何函数都可以在模板中调用。以 createNewNote 为例,您可以使用类似这样的方法来调用函数以响应按钮点击:

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

createNewNote 是一个 Controller Action 。它可以从模板调用,如上所示,也可以使用 send 从其他 Controller 或 View 调用。

从另一个 Controller 你可能有这个:

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

[更新]:解决关于钩子(Hook)的问题。

在 Ember 中, Hook 是您可以在对象上创建的函数,Ember 在管理对象层次结构和生命周期时会在不同的点调用这些函数。例如,在 Route 中,您通常希望实现 model Hook 。如果您在 Route 中声明了一个名为 model 的函数,那么 Ember 将在需要获取由该函数表示的模型时自动调用该方法路线。这允许您覆盖 Ember 查找模型的默认方式,而无需同时实现 Ember 在创建和设置路由/ Controller 时所做的所有事情。 Hook 方法在技术上与您可能在对象上实现的其他方法没有什么不同,唯一真正的区别是 Ember 会在适当的时候自动调用 Hook 方法。

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

content 是您的 Controller 所代表的对象。路由在 Controller 上设置 content,并从 model Hook 中检索。 Ember 内置了一些智能默认设置,它们会尝试根据您的 Router 做正确的事情。但是您可以实现 model Hook 以返回您想要的任何内容。

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

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

该 Controller 正在查找所有 Note 模型并将该集合设置为 NotesControllercontent 属性。

关于javascript - 这是一个 javascript 方法还是属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905022/

相关文章:

JavaScript OOP 错误的 _this 值

javascript - 如何在有序列表中显示字符串的各个部分

javascript - 我想让我的 php 知道密码中是否有数字

javascript - Ember 无法通过验证电子邮件来启用/禁用

javascript - 重写Javascript路径字符串

javascript - 在我的 Angular 2 项目中导入 javascript 文件

node.js - 在 Heroku 上部署 ember 应用程序

javascript - Ember google map 事件处理函数无法获取 `this`

ember.js - 将 JSON 对象转换为 Ember 数据模型

javascript - Ember.js:从 View 中确定当前路线