2012-01-30 2 views
1

Я использую AjaxSelect, который содержит несколько идентификаторов. Выбирая идентификатор, дополнительная информация к этому идентификатору должна отображаться в заданной таблице, которая будет сгенерирована фрагментом. Теперь я хочу знать, какое лучшее решение для обновления списка?Lift: Refresh/Reload 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

в функции машины, не так ли 'я .name' вместо 'car.name'? –

ответ

3

Вы должны использовать ValueCell и WiringUI. Очень хорошие примеры можно найти на simple_wiring и invoice_wiring.

При использовании WiringUI при каждом обновлении значенияCell cell будет обновляться контент, связанный с WiringUI.apply(cell). Поэтому он должен сделать трюк.

Вот пример для вашего конкретного случая:

HTML: же, как ваша

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

Я знаю, что мой код не идеален, главным образом в функции displayResult, поэтому, если у вас есть какой-либо комментарий предложения или отредактируйте мой ответ. –

+0

Эй, Крис, спасибо за ваш ответ и с помощью метода apply, он работает, но на самом деле я не думаю, что это решение является лучшим совпадением для моей проблемы. Поскольку я фиксирую выбранный идентификатор в 'controller.chooseCar (selectedCar.toInt)', который сохраняет id в модели, и я хочу получить выбранный Car с помощью метода 'controller.chosenCar', поэтому я бы работал с двумя переменными, которые содержат тот же идентификатор, который бесполезен. –

+0

Возможно, вы можете поместить valueCell в контроллер? У меня нет общего представления о вашем проекте, но в принципе, как только у вас есть valueCell где-то, он будет работать. –