2013-04-11 2 views
1

Я все новичок в Durandal и сейчас играю с ним в течение нескольких часов. Это кажется очень многообещающим - но теперь у меня возникла проблема, я не могу понять - и не могу найти решение с Google.Несколько foreach в Дюрандале

У меня есть вид с тремя таблицами данных - creditCardLines, cashLines и drivingReimbursementLines. Они извлекают данные из трех разных источников данных - и пользователь может добавлять новые строки в cashLines и вождение ReimbursementLines (исключая формы).

Проблема: В модели просмотра я могу легко привязать список данных к первому foreach - но я не могу понять, как привязать данные ко второму и третьему.

В функции активирования я делаю ajax-вызов для моего API-интерфейса сервера, чтобы получить данные для первого foreach, а затем возвращает обещание, когда это завершается. Как мне получить данные для второго и третьего foreach здесь?

ViewModel:

define(function() { 
    var submit = function() { 
     this.displayName = 'Expenses'; 

     this.creditCardLines = ko.observableArray(); 
     var me = this; 

     this.activate = function() { 
      return $.get('/submit/GetCreditCardLines').then(function (creditCardLines) { 
       me.creditCardLines(creditCardLines.Data); 
      }); 
     }; 
    }; 

    return submit; 
}); 

Вид:

<section> 
    <h2 data-bind="html:displayName"></h2> 

    <h3>CreditCard lines</h3> 
    <table class="table"> 
     <tbody data-bind="foreach: creditCardLines"> 
      <tr> 
       <td class="date" data-bind="text: Date"></td> 
       <td data-bind="text: Description"></td> 
       <td data-bind="text: Amount"></td> 
       <td><input type="checkbox" data-bind="checked: ApprovedEmployee" /></td> 
      </tr> 
     </tbody> 
    </table> 

    <h3>Cash lines</h3> 
    <table class="table"> 
     <tbody data-bind="foreach: cashLines"> 
      <tr> 
       <td class="date" data-bind="text: Date"></td> 
       <td data-bind="text: Description"></td> 
       <td data-bind="text: Amount"></td> 
      </tr> 
     </tbody> 
    </table> 
    <!-- TODO: Generate form to add new lines --> 

    <h3>Driving reimbursement lines</h3> 
    <table class="table"> 
     <tbody data-bind="foreach: drivingReimbursementLines"> 
      <tr> 
       <td class="date" data-bind="text: Date"></td> 
       <td data-bind="text: Description"></td> 
       <td data-bind="text: Distance"></td> 
       <td data-bind="text: Rate"></td> 
       <td data-bind="text: Amount"></td> 
      </tr> 
     </tbody> 
    </table> 
    <!-- TODO: Generate form to add new lines --> 

    <!-- Approve and save all lines as a quote with lines --> 
    <input type="submit" value="Submit quote" /> 
</section> 

ответ

2

Это, как я имел дело с несколькими JQuery отсроченных звонков с моей точки зрения модели:

return $.when(
     $.get('/submit/GetCreditCardLines'), 
     $.get('/submit/GetCashLines'), 
     $.get('/submit/GetReimbursementLines')) 
    .then(function (creditCardLines, cashLines, reimbursementLines) 
    { 
     processCreditCardLines(creditCardLines); 
     processCashLines(cashLines); 
     processReimbursementLines(reimbursementLines); 
    }) 
    .fail(function (status) 
    { 
     // Do whatever you need to if it fails 
    }); 

Вы надеваете» t нужны методы процесса, если вы не хотите их, но если вы делаете что-то сложное, я думаю, ,

+0

Не могли бы вы установить его таким образом, что каждый метод «процесс» прикован к его соответствующим $ .get с 'затем' - вместо того, чтобы объединить их в один «то»? –

+0

Вы можете, но если вы сделаете это так, все три вызова будут уволены одновременно, и он обработает тогда, когда все три вернутся, поэтому теоретически это будет быстрее. Я на самом деле только что изменил свой код, чтобы сделать это так, а не связывать запросы! Но да, вы можете связать их, если хотите. –

+0

Я вижу. То, что я думал, было следующим образом: «return $ .when ($ .get(). Then(), $ .get(). Then(), $ .get(). Then()) .fail(); 'Это должно позволить каждому вызову работать независимо от другого (при условии, что они не зависят друг от друга). Скажем, один вызов быстро возвращает данные, но требует времени для обработки - таким образом обработка может быть получена сразу же после возвращения данных. –

1

Вы должны проверить BreezeJS. У него есть возможность сделать один вызов Ajax, чтобы вытащить несколько запросов.

Взгляните на BreezeJS документы для подробного объяснения: http://www.breezejs.com/documentation/lookup-lists

Смежные вопросы