1

我正在尝试在 Rails 3.2.6 中实现 knockout.js。我正在使用宝石https://github.com/jswanner/knockoutjs-rails

我在加载 ViewModel 时遇到问题。

这是我用于调试的 HTML

<div data-bind="text: ko.toJSON(users)"></div>

这是从 CoffeeScript 编译的 JavaScript。该文件users.js.coffee通过//= require_tree .in包含在资产管道中application.js

(function() {

  jQuery(function() {
    var User, UserViewModel;    
    User = function(id, name) {
      var self;
      self = this;
      self.id = ko.observable(id);
      self.name = ko.observable(name);
      return self.followers_count_message = ko.computed(function() {});
    };
    UserViewModel = function() {
      var self;
      self = this;
      self.users = ko.observableArray([new User('1111', 'test name'), new User('1112', 'test name2')]);
      self.addUsers = function() {
        return self.users.push(new User('1113', 'test name'));
      };
      return self.addUsers();
    };
    ko.applyBindings(new UserViewModel());
    return alert('done');
  });

}).call(this);

加载后,div 显示如下:[null,null,null]

奇怪的是,如果我在 jsFiddle 中实现它,它似乎可以工作。看到这个:http: //jsfiddle.net/netwire88/HXYHU/2/

想法,想法?

更新:2012 年 7 月 31 日

我可以通过更改函数来删除return. 但是,我想将其移至另一个 CoffeeScript 文件。

我试过这个users.js.coffee,但是,我得到了错误Uncaught TypeError: Cannot read property 'nodeType' of null

User = (id, name) ->
  self = undefined
  self = this
  self.id = ko.observable(id)
  self.name = ko.observable(name)
  @

UserViewModel = ->
  self = this
  self.users = ko.observableArray([new User("1111", "test name"), new User("1112", "test name2")])
  self.addUsers = ->
    self.users.push new User("1113", "test name")
  self.addUsers()
  @

ko.applyBindings new UserViewModel()
4

1 回答 1

2

您应该注意到您发布的代码和小提琴中的代码之间非常非常重要的区别:您的视图模型返回单个属性,小提琴的视图模型没有返回。

您的代码正在创建无效的视图模型。如果您在小提琴中取消注释这些返回,它会以完全相同的方式中断。您没有发布咖啡脚本供我们查看,但这绝对是问题所在。

错误的视图模型:

User = function(id, name) {
      var self;
      self = this;
      self.id = ko.observable(id);
      self.name = ko.observable(name);
      return self.followers_count_message = ko.computed(function() {});
    };

好的视图模型

User = function(id, name) {
      var self;
      self = this;
      self.id = ko.observable(id);
      self.name = ko.observable(name);
    };

对于UserViewModel.

于 2012-07-30T22:07:02.410 回答