Knockout.js,CoffeeScript和jQuery ajax不更新文本字段

时间:2012-12-05 01:23:20

标签: knockout.js coffeescript

我正在尝试通过AJAX接收数据并在页面上显示。 ajax请求成功,但是knockout不会更新视图。可能是什么问题?

源代码:查看模型

class AppViewModel
  constructor: ->
    @company = ko.observable {name:'n/a', tariff:'n/a', contract:'n/a', balance:'0'}
    @getBriefInfo()
    @companyTariff = ko.computed  => "Tariff: #{@company.tariff}"
    @companyBalance = ko.computed => "Total: #{@company.balance}"


  getBriefInfo: ->
    $.ajax
        type: 'POST'
        url: '/index.php/site/getCompanyShortInfo'
        data: {}
        dataType: 'json'
        contentType: 'json'
        success: (res) =>
          console.log @company(), res.name, res.tariff
          @company res
          console.log @company(), res.name, res.tariff

$ ->
  ko.applyBindings(new AppViewModel(),document.getElementById("company-info"))

源代码:查看

     <ul id="company-info" class="unstyled company-info">
        <li data-bind="text: company.contract"></li>
        <li data-bind="text: company.name"></li>
        <li data-bind="text: companyBalance"></li>
        <li data-bind="text: companyTariff"></li>
    </ul>

1 个答案:

答案 0 :(得分:3)

company属性是可观察的,而不是其属性。由于您直接绑定到属性,因此当公司对象更改时,您将看不到任何更改。

您可以通过使用with绑定来逃脱。当公司发生变化时,内容应该更新。

<ul id="company-info" class="unstyled company-info">
    <!-- ko with: company -->
        <li data-bind="text: contract"></li>
        <li data-bind="text: name"></li>
    <!-- /ko -->
    <li data-bind="text: companyBalance"></li>
    <li data-bind="text: companyTariff"></li>
</ul>

如果您需要嵌套任何其他属性,则必须更改它,以便实际可以观察到属性。