2011-08-26 34 views
6

Tôi mới dùng CoffeeScript và dường như tôi gặp sự cố với cú pháp cho các phương thức gọi điện.Cú pháp gọi phương thức trong CoffeeScript

Dưới đây là mô hình thẻ:

class exports.Card extends Backbone.Model 
    defaults: 
    pip: '4' 
    suit: '♠' 
    color: 'b' 

    rows: -> 
    rows = 
     '4': [2, 0, 2] 
    rows[@pip] 

Và phần liên quan của mẫu:

<ul class="col cols-<%= @card.rows()[0] %>"> 

mà là cho tôi những lỗi Uncaught TypeError: Object #<Object> has no method 'rows'

Cụ thể, tôi đang tự hỏi nếu tôi đang sử dụng cú pháp không chính xác cho phương thức hàng của Thẻ hoặc nếu tôi chỉ hiểu nhầm điều gì đó. Cảm ơn trước!

Cập nhật:

Đối với một số lý do, @card.property luôn hoạt động tốt, nhưng @card.any_method() không bao giờ làm. Tôi đã nhận được xung quanh điều này tại thời điểm này bằng cách sử dụng tài sản, nhưng tôi rất thích nó nếu ai đó đã có thể giải thích hành vi này. Cảm ơn một lần nữa!

Cập nhật 2:

Tôi đang sử dụng http://brunchwithcoffee.com nếu đó là một sự giúp đỡ cho bất cứ ai, và đây là main.coffee tập tin để hiển thị như thế nào dụ @card đã được tạo ra và thông qua để xem.

window.app = {} 
app.routers = {} 
app.models = {} 
app.collections = {} 
app.views = {} 

Card = require('models/card_model').Card 
MainRouter = require('routers/main_router').MainRouter 
HomeView = require('views/home_view').HomeView 
CardView = require('views/card_view').CardView 

# app bootstrapping on document ready 
$(document).ready -> 
    app.initialize = -> 
    app.routers.main = new MainRouter() 
    app.views.home = new HomeView() 
    app.views.card = new CardView(model: new Card(color: 'r', suit: '♥', pip: '7')) 
    app.routers.main.navigate 'home', true if Backbone.history.getFragment() is '' 
    app.initialize() 
    Backbone.history.start() 
+1

Thẻ '@' được tạo như thế nào? Như 'new exports.Card'? Nó có vượt qua bài kiểm tra '@card instanceof exports.Card' không? –

+0

được cập nhật để hiển thị cách thẻ @ đang được tạo – mportiz08

+0

Mẹo kiểu: Bạn có thể viết '{Card} = require 'models/card_model'' thay vì' Card = require (' models/card_model '). –

Trả lời

14

Cú pháp gọi phương thức của bạn là chính xác. Các quy tắc có liên quan cho CoffeeScript là:

  • ngoặc là không bắt buộc cho các cuộc gọi phương pháp gọi với đối số tức là

    object.method 1,2 
    

    hoặc

    object.method(1,2) 
    
  • ngoặc được yêu cầu cho các cuộc gọi phương pháp gọi không có tham số tức là

    object.method() 
    

Để xem cách thức hoạt động này thử chạy các đoạn mã sau vào 'Hãy thử CoffeeScript' biên tập viên trên trang web CoffeeScript:

class A 
    method: -> 
    console.log "A" 

(new A()).method(); 

Kể từ cú pháp gọi phương thức của bạn là chính xác có vẻ như có khả năng rằng vấn đề là các @card variable không phải là một thể hiện của lớp exports.Card.

+0

hm, tôi thực sự bối rối sau đó - thẻ @ chắc chắn là một thể hiện của lớp Thẻ, vì tôi có thể an toàn để '<% = @ card.pip%>' một trong các dòng trước đó trong chế độ xem – mportiz08

+0

bạn đã đúng - @ thẻ thực sự là toJSON() tương đương với những gì tôi đã nghĩ rằng nó là – mportiz08

1

Vấn đề là pip không phải là tài sản của cá thể Card; đó là tài sản của Card::defaults, vì vậy Backbone sau đó biến nó thành thuộc tính của cá thể Card — không phải là thuộc tính .Bạn có thể truy cập vào thuộc tính pip với

card.get 'pip' 

hoặc trực tiếp như

card.attributes.pip 

Lý do cho sự khác biệt này là, trong JavaScript, không có cách nào để theo dõi một tài sản cho những thay đổi, mà Backbone cần làm để gửi các sự kiện. (Nếu bạn sửa đổi pip với card.set 'pip', sau đó Backbone bắn một sự kiện "change", ví dụ.)

Vì vậy, mã của bạn nên làm việc tốt nếu bạn chỉ cần thay đổi dòng cuối cùng của phương pháp rows:

rows: -> 
    rows = 
    '4': [2, 0, 2] 
    rows[@get 'pip'] 

(Lưu ý: Getters/setters được hỗ trợ trong một số môi trường JS JS, cho phép bạn ánh xạ card.pip = ... đến card.set 'pip', ... Xem bài viết của John Resig trên đó here. với tất cả các trình duyệt hiện đại.)

+0

cảm ơn cho làm rõ về tài sản so với thuộc tính, nhưng tôi vẫn nhận được lỗi 'không có phương pháp' khi gọi bất kỳ phương pháp trên @ Thẻ – mportiz08

0

Cuối cùng đã tìm ra - Tôi quên biến số @card được tham chiếu trong mẫu không bắt nguồn từ tệp main.coffee - nó thực sự được chuyển đổi thành JSON trong CardView tại đây:

cardTemplate = require('templates/card') 

class exports.CardView extends Backbone.View 
    tagName: 'div' 
    className: 'card' 

    render: -> 
    $(@el).html cardTemplate(card: @model.toJSON()) 
    @ 

Hiện tại, chỉ có các biến đang hoạt động chứ không phải phương thức - @card thực sự là biểu diễn JSON của cá thể mô hình.

Cảm ơn tất cả các đề xuất/giải thích kẻ - xin lỗi vì lỗi lầm: P

Các vấn đề liên quan