淘汰赛和coffeescript - 未发现的类型错误

时间:2012-11-07 14:44:55

标签: javascript knockout.js coffeescript

我想用淘汰赛和咖啡脚本维护简单的应用程序。我想添加一些Json对象,如:

[
    {
        Name = "",
        Subscribe = "",
        ScrollOfDish = [0]
    },
    {
        Name = "",
        Subscribe = "",
        ScrollOfDish = [0]
    }
]

这是我的代码:

class Complex
        constructor: ()->
            @ComplexItems = ko.observableArray()
            @getAllComplex()
        self = this

        getAllComplex:()->
            $.ajax
                type: "POST"
                url: "/Complex/GetAllComplex"
                data: {}
                dataType:"json"
                contentType:"json"
                success:(res)->
                        self.ComplexItems res // here is the problem


    $(document).ready ()->
        window.model = new Complex()
        ko.applyBindings(model)

但我遇到了未解决类型错误的问题ComplexItems不是一个函数。当然,我尝试反向self.ComplexItemsmodel.ComplexItems - 它不起作用 - 但我想理解为什么我的例子不起作用。

2 个答案:

答案 0 :(得分:0)

你的self = this位于错误的位置..现在它正在使'self'指向构造函数(而不是类的任何实例......)。 应该是:

class Complex
    constructor: ()->
        @ComplexItems = ko.observableArray()
        @getAllComplex()        

    getAllComplex:()->
        self = this    
        $.ajax
            type: "POST"
            url: "/Complex/GetAllComplex"
            data: {}
            dataType:"json"
            contentType:"json"
            success:(res)->
                    self.ComplexItems res


$(document).ready ()->
    window.model = new Complex()
    ko.applyBindings(model)

答案 1 :(得分:0)

首先,您需要修复JSON以使用:而不是=。您可以删除逗号,甚至是大括号:

[
  Name: ''
  Subscribe: ''
  ScrollOfDish: [0]
,
  Name: ''
  Subscribe: ''
  ScrollOfDish: [0]
]

以下是视图模型代码的工作版本:

$ ->

  class Complex
    constructor: ->
      @complexItems = ko.observableArray()
      @getAllComplex()

    getAllComplex: ->
      $.ajax
        type: 'POST'
        url: '/Complex/GetAllComplex'
        data: {}
        dataType: 'json'
        contentType: 'json'
        success: (res) =>
          @complexItems res

  window.model = new Complex()
  ko.applyBindings model

您只需使用胖箭头=>complexItems绑定到右侧this即可。我做了一些风格上的改变:

  1. 使用->代替() ->
  2. 使用@代替this
  3. 使用驼峰大小写变量名称(complexItems
  4. 对非插值字符串使用单引号
  5. 使用$ ->代替$(document).ready ->
  6. 我建议您阅读this样式指南。