2012-08-09 15 views
7

Tengo una vista que tiene contenido expandible/plegable que me gustaría poder alternar haciendo clic en la fila de la tabla. Antes pre1.0, tenía esto en la plantilla:manipulación acción en vista no enrutador

<tr {{action "expand"}}> 

que fue manejado con anterioridad en mi punto de vista:

App.ContentRowView = Em.View.extend({ 
    templateName: 'ember/templates/content/row', 
    expand: function() { 
     this.set('isExpanded', !this.get('isExpanded')); 
    }, 
    isExpanded: false 
}); 

Sin embargo, después de actualizar a pre1.0 la acción está ahora directamente por el fielded enrutador Esto tiene sentido en muchas situaciones, pero en este caso la expansión es realmente una preocupación de la vista. Intenté simplemente reemplazar esto con un controlador de evento click sin suerte.

¿Existe una mejor práctica sobre cómo manejar un evento de preocupación de vista como este con pre1.0?

Respuesta

20

respuesta desuso


Incluso si la respuesta de @ outside2344 funciona, creo que no es exactamente correcto. Indeed parentView no representa la vista, sino la vista padre de su parentView. Desde 1.0-pre, las vistas conservan su contexto, por lo que en la plantilla, this representa parentView, parentView representa parentView.parentView y view representa la vista actual. Aquí es un violín para ilustrar esto: http://jsfiddle.net/Sly7/cnmJa/

Para mí la respuesta es {{action expand target="view"}}

EDITAR (respondiendo a @Gal Ben-Haim)

ayudantes de acción se comportan poco diferente en un router de base solicitud. Presupuesto de la documentación:

En aplicaciones impulsadas por el router, si una acción no es interceptada por una visión, tendrá la cual se tomó ese punto de vista de la burbuja hasta la Ruta ese evento. Si esa Ruta es una subruta de otra Ruta, la transición se buscará allí hasta la definición de la Ruta de nivel superior, nuestro über-container: root.

Este efecto de burbujeo permite que ciertas acciones permanezcan privadas. Si ciertas transiciones solo deberían estar disponibles para ciertos sub-sub-estados, coloque la transición en el subestado y haya logrado un tipo de alcance.

Básicamente, para mí eso significa en aplicaciones Router impulsada si no se define explícitamente un objetivo en el ayudante de acción, se envía al router.


respuesta Actualizado

Creo que ahora las guías responden muy bien a esta pregunta.vea http://emberjs.com/guides/templates/actions/#toc_specifying-a-target

+0

los documentos del enrutador http://emberjs.com/guides/router_primer/#toc_navigation hablan claramente sobre los eventos manejados por vistas y un efecto de burbujeo hasta el enrutador. No entiendo por qué esto no funciona y todo va directamente al enrutador, o los documentos están equivocados/desactualizados? –

+0

He editado mi respuesta qutoing the doc. –

+1

Muy bien respondido, este es un punto de confusión ... – hagope

1

En pre1.0 puede hacer que el campo de visión de la acción mediante la adición de target = "parentView" a la acción:

{{action "expand" target="parentView"}} 
+1

También podría envolver el objetivo (si tiene varias acciones y/o enlaces) en un solo objeto/vista con un ' {{con}} declaración. – SciSpear

1

Los eventos no burbujean a través de la jerarquía de vista de forma predeterminada. Puede cambiar esto (aunque no puedo decir que lo recomendaría):

(function() { 
    Ember.View.reopen({ 
     // Let actions bubble to parentView by default. 
     target: function() { 
      return this.get('parentView'); 
     }.property('parentView') 
    }); 
})();