2012-01-30 4 views
1

J'utilise un AjaxSelect qui contient plusieurs identifiants. En sélectionnant un identifiant, les informations supplémentaires à cet identifiant doivent être affichées dans une table donnée qui sera générée par un extrait. Maintenant, je veux savoir quelle serait la meilleure solution pour rafraîchir ma liste?Lift: Actualiser/Recharger Snippet

HTML:

<table> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>Type</th> 
     </tr> 
    </thead> 

    <tbody> 
     <tr class="lift:MainScreen.cars"> 
      <td><car:name /></td> 
      <td><car:type /></td> 
     </tr> 
    </tbody> 
</table> 

SCALA:

def doSelect(msg: NodeSeq) = { 
    SHtml.ajaxSelect(cars.map(i => (i.no.toString, i.no.toString + ". Car")), 
    Empty, { 
     selectedCar => 
     controller.chooseCar(selectedCar.toInt) 
     // RELOAD TABLE 
    }) 
} 

def cars(node: NodeSeq): NodeSeq = { 
    val cars = controller.chosenCarFamily.cars 
    cars match { 
    case null => Text("There is no items in db") 
    case game => game.flatMap(i => 
     bind("car", node, 
      "name" -> car.name, 
      "type" -> car.type)) 
    } 
} 
+0

Dans les voitures de fonction, est pas 'i .name' au lieu de 'car.name'? –

Répondre

3

Vous devez utiliser ValueCell et WiringUI. De très bons exemples peuvent être trouvés au simple_wiring et invoice_wiring. Lors de l'utilisation de WiringUI, chaque fois que valueCell cell est mis à jour, le contenu associé à WiringUI.apply(cell) sera mis à jour. Donc ça devrait faire l'affaire.

Voici un exemple pour votre cas particulier:

HTML: même que le vôtre

SCALA:

class MainScreen{ 
    def doSelect(msg: NodeSeq) // same as yours 

    def cars = WiringUI.apply(controller.chosenCarFamily)(displayResult) 

    def displayResult(carFamily:CarFamily)(node: NodeSeq) ={ 
    carFamily.cars match { 
     case null => Text("There is no items in db") 
     case game => game.flatMap(i => 
     bind("car", node, 
      "name" -> i.name, 
      "type" -> i.type)) 
    } 
    } 
} 

object Controller{ 
    val selectedCar = ValueCell(1) 
    def chooseCar = sectectedCar.set  
    val chosenCarFamily = selectedCar.lift(car:Int => //Stuff to output the family) 
} 
+0

Je sais que mon code n'est pas parfait, principalement dans la fonction "displayResult", donc si vous avez des suggestions, commentez ou modifiez ma réponse. –

+0

Salut Chris, merci pour votre réponse et avec la méthode apply cela fonctionne, mais en fait je ne pense pas que cette solution soit la meilleure pour mon problème. Parce que je valide l'identifiant choisi dans 'controller.chooseCar (selectedCar.toInt)' qui sauvegarde l'identifiant dans un modèle et je veux obtenir la voiture choisie en utilisant la méthode 'controller.chosenCar' donc je travaillerais avec deux variables qui contiennent le même identifiant qui est inutile. –

+0

Peut-être que vous pouvez mettre la valeurCell dans le contrôleur? Je n'ai pas la vue totale de votre projet mais au fond, dès que vous avez une valeurCell quelque part, cela fonctionnera. –