2013-04-11 81 views
1

我都是Durandal的新手,现在已经玩了几个小时了。它看起来非常有前途 - 但现在我遇到了一个问题,我无法弄清楚 - 并且找不到Google的解决方案。Durandal中的多个foreach

我有三张数据表 - creditCardLines,cashLines和drivingReimbursementLines。他们从三个不同的数据源获取数据 - 用户可以将新行添加到cashLines和drivingReimbursementLines(省略表单)。

问题:在viewmodel中,我可以轻松地将数据列表绑定到第一个foreach - 但我无法弄清楚如何将数据绑定到第二个和第三个。

在激活函数中,我对服务器API进行ajax调用以获取第一个foreach的数据 - 然后在完成时返回承诺。我如何获得第二和第三个foreach的数据?

视图模型:

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 
    }); 

你不”如果你不需要它们,就需要过程方法,但如果你做了任何复杂的事情,我认为拥有它们是更加合适的。

+0

你能设定,让每一个“过程”方法被链接到其相应的$不用彷徨与'then' - 而不是将它们组合成一个'然后'? – 2013-04-11 20:50:39

+0

你可以,但如果你这样做,所有三个电话都会同时被触发,当三个电话都回来时它会处理,所以它理论上应该更快。实际上我只是改变了我的代码,而不是链接请求!但是,是的,如果你愿意,你可以把它们连起来。 – 2013-04-11 20:59:09

+0

我明白了。我在想的就是像这样链接它:'return $ .when($ .get()。then(),$ .get()。then(),$ .get()。then()).fail ();'这应该允许每个调用独立于另一个调用(假设它们不依赖于其他调用)。说一个调用很快就会返回数据,但是需要一段时间才能处理 - 这样,只要返回数据,处理就可以完成。 – 2013-04-12 00:55:48