2

Knockout と Coffeescript を使用します。以下は簡単なサンプルコードです。

**** coffeescript ****
    class NewsItem
        constructor : (content) ->
            @content = ko.observable(content)

    class ViewModel
        constructor : ->        
            @items = ko.observableArray()
            @item = ko.observable()

            @items.push new NewsItem('a')
            @items.push new NewsItem('b')
            @items.push new NewsItem('c')

            @addItem = ->
                @items.push new NewsItem @item()

    $ ->
        ko.applyBindings new ViewModel
        return  

**** html ****
    <ul data-bind="foreach: items">
        <li data-bind="text: $data.content"></li>
    </ul>
    <div>
        <input type="text" data-bind="value: item" />
        <button data-bind="click: addItem">Add Item</button>
    </div>

上記のコードはうまく機能しています。私が疑問に思っているのは、このキーワードを上記のように使用するか、プロトタイプメンバーを次のように使用して addItem イベントを宣言する必要があるということです

class NewsItem
    constructor : (content) ->
        @content = ko.observable(content)

class ViewModel
    constructor : ->        
        @items = ko.observableArray()
        @item = ko.observable()

        @items.push new NewsItem('a')
        @items.push new NewsItem('b')
        @items.push new NewsItem('c')

    addItem : ->
        console.log @item()
        @items.push new NewsItem @item()

$ ->
    ko.applyBindings new ViewModel
    return      

インスタンス オブジェクト間で値を共有しないようにするために、このキーワードを使用して、監視可能なプロパティ (コンテンツ、アイテム、アイテム) をインスタンス メンバーにする必要があることを理解しています。それはそれでいいのですが、私の場合、addItemメソッドなどのイベント関数はどうでしょうか。

4

1 に答える 1

2

2 番目のケースでは問題なく動作します。試してみてください ;)。

class Randomized
  constructor: -> @items = [Math.random()]
  first: -> @items[0]

console.log new Randomized().first()
console.log new Randomized().first()
console.log new Randomized().first()
于 2013-04-10T09:08:22.370 に答える