Knockout和Rails:从rails对象填充viewModel

时间:2012-11-16 17:19:34

标签: ruby-on-rails ruby knockout.js

这可能是一个简单的问题:我可以使用rails实例对象填充我的knockout viewmodel吗?例如,我在mysite.com/person/1上有一个编辑页面。控制器发现该人和视图可以使用@person来呈现其数据。

我可以使用@person填充我的viewModel吗?喜欢:

self.name = ko.observable(@person.name);

1 个答案:

答案 0 :(得分:4)

是的,但您必须输出erb的变量,例如

ko.observable("<%=  @person.name %>");

但是,一般情况下,您不希望将特定变量传递给特定的observable,您希望将资源本身传递给视图模型的新I站点,然后从中设置视图模型变量,我将更新为我到达计算机时的一个更好的例子,但基本上是:

ko.applyBindings(new viewModel("<%= resource.to_json.html_safe %>"));

使用更好的示例进行更新

一个人视图模型我的结构大致是这样的,请注意括号,我不确定为什么需要它们,但如果我没记错的话,没有它们就无法工作。

var personViewModel = function(person){

  var self = this;
  self.first_name = ko.observable(person.first_name);
  self.last_name = ko.observable(person.last_name);
  self.friends = ko.observableArray(person.friends);

}

person_json = <%= (@person.to_json.html_safe) %>;

ko.applyBindings(new personViewModel(person_json));

但是,我喜欢在我的视图模型中使用coffeescript,作为每个视图模型的类,这里是coffeescript中相同的代码(工作,粗略等效,使用类而不是函数)。

view_models / personviewmodel.js.coffee

class PersonViewModel
  constructor: (person) ->
    @first_name = ko.observable(person.first_name)
    @last_name = ko.observable(person.last_name)
    @friends = ko.observableArray(person.friends)

window.PersonViewModel = PersonViewModel

然后在你的实际视图下面附上的表格。

person_json = <%= (@person.to_json.html_safe) %>;

ko.applyBindings(new PersonViewModel(person_json));