2012-02-02 11 views
6

Tengo una vista de programa que muestra el elemento seleccionado de una lista. Luego, cuando hago clic en el botón Editar, aparece la vista de edición a través de {{#if isEditing}}ember.js cambio de una vista desde otra vista

Cuando hago clic en otro elemento de la lista, la vista de visualización cambia al nuevo elemento seleccionado pero permanece en el estado de edición.

¿Cómo puedo cambiar el estado de una vista isEditing desde otra vista?

He hecho esto por el momento con una función FocusOut que establece isEditing en falso pero tengo 2 campos de texto en esta vista y cuando hago clic en el otro campo de texto también desencadena la función focusOut.

Esto debe ser simple, pero parece que no puede resolverlo.

+0

así que han terminado de hacer esto, pero no es bastante y estoy seguro que no es la forma correcta !! @get ('parentView'). get ('parentView'). get ('childViews') [1] .set ('isEditing', false) –

Respuesta

3

Buena pregunta. Creo que debe hacer algo un poco más complicado que un enlace simple para controlar el contenido del App.SelectedItemView. Me gustaría probar otra propiedad computada en su lugar:

App.SelectedItemView = Ember.View.extend({ 
    isEditing: false, 
    content: function() { 
    var selectedItem = App.SelectedItemController.get('content'); 
    this.set('editingItem', false); 
    return selectedItem; 
    }.property('App.SelectedItemController.content'), 
}); 

El truco acerca de las propiedades calculadas es que se puede obtener el mismo resultado como una simple unión, pero también se puede añadir código personalizado para ejecutar cuando cambia el valor observado (como condicionalmente configurando editingItem a null en este caso). La desventaja de una propiedad calculada es que es un poco más complicado realizar un enlace bidireccional (por ejemplo, en este caso para establecer App.SelectedItemController.content cuando cambia App.SelectedItemView.content), pero parece que no es necesario que haga eso de todos modos.

0

No desearía que dos vistas se conectaran lógicamente de forma directa, sino que querría que esta correlación se realizara a través de un enlace (probablemente no en este caso, ya que la operación de edición no parece estar vinculada a un modelo o propiedad?) o a través de una función en la capa de controlador?

+0

La pregunta original también me interesa mucho. En la mayoría de los casos, pasar por un enlace puede ser correcto, pero a veces simplemente no desea establecer un Ember.Object adicional o un atributo adicional solo para pasar datos de una vista a la otra. Entonces, creo que poder cambiar los datos desde otra vista podría ser útil. ¿Qué quisiste decir con "a través de la capa de controlador"? –

+0

@jasonpgignac Por favor, ¿me pueden mostrar un ejemplo de cómo hacerlo a través de la capa de controlador? Gracias –

1

¿Cómo puedo cambiar el estado de una vista isEditing desde otra vista?

No creo que esto sea realmente lo que quieres hacer. En el evento de clic para el elemento, probablemente esté cambiando la propiedad content del controlador. Desea que isEditing sea falso cada vez que cambie content.

Puede configurar un observador de manejar esto:

App.SelectedItemView = Ember.View.extend(
{ 
    isEditing: false, 
    contentBinding: 'App.SelectedItemController.content', 
    contentChanged: function() 
    { 
     this.set('isEditing', false); 
    }.observes("content") 
}); 
Cuestiones relacionadas