2012-08-07 91 views
3
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() 

如果我把这叫做:继承和knockoutjs

$(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是不满意这点继承?

回答

2

使用super而不是super()FormViewModelbuildModel功能。

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

所以这个小类总是调用父类型为buildModel的函数,其中data = undefined

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

+0

非常感谢! – Jonas 2012-08-09 13:06:31