这可能是一个简单的问题:我可以使用rails实例对象填充我的knockout viewmodel吗?例如,我在mysite.com/person/1上有一个编辑页面。控制器发现该人和视图可以使用@person来呈现其数据。
我可以使用@person填充我的viewModel吗?喜欢:
self.name = ko.observable(@person.name);
答案 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));