Javascript 显示模块模式、KnockoutJS和CoffeeScript

Javascript 显示模块模式、KnockoutJS和CoffeeScript,javascript,knockout.js,Javascript,Knockout.js,这可能是一个非常初级的问题,或者我一次使用了太多的东西。我正在尝试使用KnockoutJS,并尝试编写CoffeeScript。我把我的模型放在一个单独的函数中。代码如下: myapp =(-> person =-> firstname = ko.observable "k" lastname = ko.observable "d" firstname:firstname, lastname:lastname

这可能是一个非常初级的问题,或者我一次使用了太多的东西。我正在尝试使用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中使用workbench创建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>
谁能解释一下这里出了什么问题?或者有没有其他方法来编写CoffeeScript来使用KnockoutJS


如果需要更多详细信息,请发表意见。

以下是工作示例:

​ 您需要更改绑定语法:

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

名字:
姓氏:

因为当您调用ko.applyBindings(new myapp.person())时,您只为person对象而不是所有myapp对象设置视图

如果您想为整个myapp设置视图,您需要如下更改代码:

myapp=(->
person=(fname,lname)->
firstname=ko.observable fname
lastname=ko.observable lname
名字:名字,
姓氏:姓氏
人物:新人(“杰克”、“麻雀”)
)()
$(->
ko.applyBindings(myapp)
@
)

名字:
姓氏:


以下是工作示例:

​ 您需要更改绑定语法:

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

名字:
姓氏:

因为当您调用ko.applyBindings(new myapp.person())时,您只为person对象而不是所有myapp对象设置视图

如果您想为整个myapp设置视图,您需要如下更改代码:

myapp=(->
person=(fname,lname)->
firstname=ko.observable fname
lastname=ko.observable lname
名字:名字,
姓氏:姓氏
人物:新人(“杰克”、“麻雀”)
)()
$(->
ko.applyBindings(myapp)
@
)

名字:
姓氏:


它成功了。谢谢还有一个请求,请您解释一下我哪里做错了,或者绑定是如何工作的。所以,下次我会小心的。再次感谢。调用ko.appyBindings(x)很简单,您可以为视图定义一个模型(x)。这意味着您只能从数据绑定访问x属性。您在调用新的myapp.person()时创建了一个单人对象。这意味着您只能访问firstname和lastname字段。但您使用myapp.person().firstname来访问此人的姓名。您的模型中不存在myapp和person对象。我将模型设置为myapp,它有一个新创建的person对象。所以我可以先从数据绑定中访问person对象,然后访问它的字段,就像person.firstName一样。谢谢还有一个请求,请您解释一下我哪里做错了,或者绑定是如何工作的。所以,下次我会小心的。再次感谢。调用ko.appyBindings(x)很简单,您可以为视图定义一个模型(x)。这意味着您只能从数据绑定访问x属性。您在调用新的myapp.person()时创建了一个单人对象。这意味着您只能访问firstname和lastname字段。但您使用myapp.person().firstname来访问此人的姓名。您的模型中不存在myapp和person对象。我将模型设置为myapp,它有一个新创建的person对象。所以我可以先访问person对象,然后从数据绑定中访问它的字段,比如person.firstname
<p>
    Firstname: <span data-bind="text:firstname"></span>
    Lastname: <span data-bind="text:lastname">
    </span>
</p>​ 
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>​