2012-08-02 87 views
1

這可能是一個非常初學者的問題,或者我一次使用太多東西。我正在嘗試使用KnockoutJS和Revealing Module Pattern並嘗試編寫CoffeeScript。我把模型放在一個單獨的函數中。下面是代碼:揭示模塊模式,KnockoutJS和CoffeeScript

myapp =(-> 
    person =-> 
     firstname = ko.observable "k" 
     lastname = ko.observable "d" 

     firstname:firstname, 
     lastname:lastname 

    person : person 
)() 

$(-> 
    ko.applyBindings(new myapp.person()) 
    @ 
) 

現在,這是使用工作臺在Visual Studio這樣的JavaScript創建:

(function() { 
    var myapp; 

    myapp = (function() { 
    var person; 
    person = function() { 
     var firstname, lastname; 
     firstname = ko.observable("k"); 
     lastname = ko.observable("d"); 
     return { 
     firstname: firstname, 
     lastname: lastname 
     }; 
    }; 
    return { 
     person: person 
    }; 
    })(); 

    $(function() { 
    ko.applyBindings(new myapp.person()); 
    return this; 
    }); 

}).call(this); 

現在,這是給錯誤,現在能找到的元素與束縛。這裏是簡單的HTML文本:

<p> 
    Firstname<span data-bind="text: myapp.person().firstname"></span> 
    Lastname<span data-bind="text: myapp.person().lastname"> 
    </span> 
</p> 

如果我創建正常的JavaScript沒有自稱爲函數它工作正常。這裏是功能:

myapp = (function() { 
    var person; 
    person = function() { 
     var firstname, lastname; 
     firstname = ko.observable("k"); 
     lastname = ko.observable("j"); 

     return { 
     firstname : firstname, 
     lastname : lastname 
     } 
    } 

    return { 
     person: person 
    } 
})(); 


$(function() { 
    ko.applyBindings(new myapp.person()); 
}) 

任何人都可以解釋什麼問題在這裏?還是有另一種編寫CoffeeScript來使用KnockoutJS的方法?

如果需要更多細節,請發表評論。

回答

1

這裏是工作示例:http://jsfiddle.net/gurkavcu/Kqa2k/

myapp = (-> 
    person =-> 
     firstname = ko.observable "jack" 
     lastname = ko.observable "sparrow" 

     firstname:firstname, 
     lastname:lastname 

    person : person 
)() 

$(-> 
    ko.applyBindings(new myapp.person()) 
    @ 
) 

您需要更改綁定語法:

<p> 
    Firstname: <span data-bind="text:firstname"></span> 
    Lastname: <span data-bind="text:lastname"> 
    </span> 
</p>​ 

因爲當你調用ko.applyBindings(新myapp.person())設置只有一個人的觀點不是所有的myapp對象。

如果你想設置你的觀點,你需要改變這樣的代碼整個MYAPP:

JSfiddle Link

myapp = (-> 
    person = (fname,lname)-> 
     firstname = ko.observable fname 
     lastname = ko.observable lname 

     firstname:firstname, 
     lastname:lastname 

    person : new person("Jack" , "Sparrow")  

)() 

$(-> 
    ko.applyBindings(myapp)  
    @ 
) 

<p> 
    Firstname: <span data-bind="text:person.firstname"></span> 
    Lastname: <span data-bind="text:person.lastname"> 
    </span> 
</p>​ 
+0

它的工作。謝謝。還有一個要求,請你解釋一下我做錯了什麼或者約束如何工作。所以,下次我會照顧的。 再次感謝。 – kunjee 2012-08-02 15:31:50

+1

它簡單,當你調用ko.appyBindings(x)你爲你的視圖定義一個模型(x)。這意味着您只能從data-bind訪問x屬性。當您調用新的myapp.person()時,您創建了一個人對象。這意味着您只能訪問名字和姓氏字段。但是您使用myapp.person()。firstname來獲取人名。模型中不存在myapp和person對象。我將我的模型設置爲具有新創建的人物對象的myapp。所以我可以首先訪問person對象,然後從data.black像person.firstname那樣訪問它的字段 – Luffy 2012-08-02 15:58:38