2011-12-27 52 views
1

作为探索ember.js的一种方法,我重新创建了具有100%功能兼容版本的主干todo示例应用程序。我遇到的第一个问题是双击编辑创建的待办事项后,如何处理Ember.TextField上的模糊事件以退出编辑模式。当前的代码如下:在ember视图中处理TextField子项的模糊

<script type="text/x-handlebars" data-template-name="todo-list-template"> 
    <ul> 
    {{#each App.TodosController.todos}} 
     {{#view App.TodoView tagName="li" contentBinding="this"}} 
     {{#if editMode}} 
      {{view Ember.TextField valueBinding="content.text"}} 
     {{else}} 
      {{content.text}} 
     {{/if}} 
     {{/view}} 
    {{/each}} 
    </ul> 
</script> 

App.TodoView = Ember.View.extend({ 
    editMode: false, 
    doubleClick: function(evt){ 
    this.set('editMode', true); 
    }, 
    blur: function(evt){ 
    this.set('editMode', false); 
    } 
}); 

我曾以为,从由Ember.TextField定义的输入元素的blur事件会冒泡,以我的观点,但在我看来,模糊处理程序似乎永远不会被调用。

回答

7

我看着来源,我认为你必须使用TextSupport混入https://github.com/emberjs/ember.js/blob/master/packages/ember-handlebars/lib/controls/text_support.js#L25-28

定义的focusOut事件和focusOut事件不能上升到parentView,这就是为什么自定义App.TextField定义。

把手:

<script type="text/x-handlebars"> 
<ul> 
{{#each App.TodosController.todos}} 
    {{#view App.TodoView tagName="li" contentBinding="this"}} 
    {{#if view.editMode}} 
     {{view App.TextField editModeBinding="view.editMode" valueBinding="view.content.text"}} 
    {{else}} 
     {{view.content.text}} 
    {{/if}} 
    {{/view}} 
{{/each}} 
</ul> 
</script>​ 

JS:

App.TextField = Ember.TextField.extend({ 
    didInsertElement: function(){ 
    this.$().focus(); 
    }, 

    focusOut: function(evt) { 
    this.set('editMode', false); 
    } 
}); 

App.TodoView = Ember.View.extend({ 
    editMode: false, 
    doubleClick: function(evt) { 
     this.set('editMode', true); 
    } 
}); 

http://jsfiddle.net/cvWWe/34/

+2

那么这肯定似乎工作,以便感谢您的回答,请参见工作示例。我喜欢到目前为止的烬,但有时我觉得我想要能够处理子节点的dom事件,而不必将每个事件包装在新的视图对象中。我认为这是反对一些风格,甚至可能是代码味道。 – user1117841 2011-12-27 16:36:17

+2

如果你想处理事件,我们一般认为你应该创建一个新视图来封装这些事件。 我们正在为简单的目标/行动案例制定解决方案,但焦点/模糊的情况足够复杂,您应该只需制作自定义视图。 – 2011-12-27 19:56:52