这是我要对剔除js进行简化的示例:
<!DOCTYPE HTML>
<html>
<head>
<title>test</title>
<script type="text/javascript" src="https://github.com/downloads/SteveSanderson/knockout/knockout-2.0.0.debug.js"></script>
<script type="text/javascript">
var derp = { "foo": 1, "bar": 2 };
window.onload = function() { go(); }
function go()
{
var ViewModel = function(foobar)
{
this.foo = ko.observable(foobar.foo);
this.bar = ko.observable(foobar.bar);
}
ko.applyBindings(new ViewModel(derp));
}
</script>
</head>
<body>
<input data-bind="value: foo"/>
<input data-bind="value: bar"/>
<button onclick="go();">Go</button>
</body>
</html>
这段代码的目的是让敲除js更新derp中的值,而不是ViewModel内部的副本.
有没有一种方法可以通过剔除轻松完成此任务,还是我在错误的树上吠叫?
编辑上下文:
这是从更大的应用程序中剔除的.我的意图是使用剔除来显示和编辑大型,毛茸茸的javascript对象的属性.这些对象由用户动态实例化,并可随意在它们之间切换.
在我发现敲除之前,我是手动创建的DOM元素来显示和编辑每个杂乱而繁琐的对象.我对使用C#中的WPF通过MVVM拥有一些经验,并且会更倾向于使用该方法.我对剔除的最初了解是这样做,而不是意识到ViewModel复制了ko.observable *捕获的值. ViewModel仍然对我有用,因为它允许我有条件地公开并简化对我要编辑的成员的访问.
解决方法:
我确实喜欢使用Save方法的@Etch响应.这很有帮助.
但是,如果您想自动化这样的事情,那么我将对可观察对象进行订阅.
也许这不是一种更清洁的方法.如果我能够通过引用传递变量,那将更加高兴.
我更喜欢在可观察变量周围使用一些包装器以减少输入:
var returnFireObservable = function(variable, property) {
var obs = ko.observable(variable[property]);
obs.subscribe(function(newValue) {
variable[property] = newValue;
});
return obs;
};
并以这种方式在代码中使用:
var ViewModel = function(foobar) {
this.foo = returnFireObservable (foobar, "foo");
this.bar = returnFireObservable (foobar, "bar");
};
ko.applyBindings(new ViewModel(derp));
小样http://jsfiddle.net/AlfeG/eQ9Zf/2/
希望这可以帮助.