继承和淘汰赛

时间:2012-08-07 15:33:18

标签: inheritance knockout.js coffeescript

class ViewModel
  constructor: ->
    $.ajax({url: '#.json', type: 'GET', dataType: 'json'})
    .done @buildModel

  buildModel: (data) =>
    @model = ko.mapping.fromJS(data)
    @model.update = =>
      delete @model.update
      jsonForm = ko.mapping.toJSON(@model)
      $.ajax({url: '#.json', data: jsonForm, type: 'PUT', contentType:"application/json; charset=utf-8", dataType: 'json'})
      .done @buildModel

    ko.applyBindings(@model)

###################################################################

class FormViewModel extends ViewModel
  buildModel: =>
    super()

如果我这样称呼:

$(document).bind 'pageinit', =>
  @form = new ViewModel
一切都很好。如果我尝试继承

$(document).bind 'pageinit', =>
  @form = new FormViewModel

收到错误:

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: update is not defined;
Bindings value: click: update 

为什么ko.applyBindings对这种继承不满意?

1 个答案:

答案 0 :(得分:2)

super的{​​{1}}功能中使用super()代替FormViewModel

  • buildModel表示:调用同名的父方法,不带任何参数。
  • super()表示:使用我收到的任何参数调用同名的父方法。

因此,子类始终使用data = super调用父buildModel函数。

另请注意,我认为您不应该在undefined函数中调用ko.applyBindings。对于整个视图模型,调用应该只需要发生一次。