我尝试像WPF-MVVM
一样使用Knockout
在WPF
中,有一个选项可以通知VM更改属性
例如:如果我有一个textBox,我可以使用UpdateSourceTrigger=PropertyChanged
每次点击通知VM。
<Grid DataContext="MyVM">
<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</Grid>
在Knockout中,我构建了这个简单的应用程序:
VM:
function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
ko.applyBindings(new AppViewModel());
查看:
<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>
<p>Full name: <strong data-bind="text: fullName"></strong></p>
我正在尝试 但没有成功 ,要更新textBox上的fullName
输入点击(不是onblur)。
修改
代码工作正常。 我只是希望姓氏将在firstname / lastname文本框中写入 时更新 。
现在它已更新 onblur ,在写作时没有更新。
答案 0 :(得分:3)
为了更改输入的更新模式,因为您建议在淘汰赛中有一些内置方法来实现此目的。
请参阅此参考:http://knockoutjs.com/documentation/value-binding.html
特别是关于价值更新的部分。
在这种情况下,您可以使用valueUpdate: 'afterkeydown'
来更新绑定。
在这个例子中需要改变的只是你的绑定。
<p>First name: <input data-bind="value: firstName, valueUpdate: 'afterkeydown'" /></p>
<p>Last name: <input data-bind="value: lastName, valueUpdate: 'afterkeydown'" /></p>
<p>Full name: <strong data-bind="text: fullName"></strong></p>
<button data-bind="click: capitalizeLastName">Go caps</button>
更新了JSFiddle:http://jsfiddle.net/infiniteloops/en6AR/1/
答案 1 :(得分:1)
您的代码逻辑上正常,您的问题是this
函数内的capitalizeLastName
误用。
在您的情况下,this
关键字指的是函数所属的对象,如果函数不属于您的View-Model对象,则指向window
对象。这就是为什么在大多数KnockoutJS示例中,我们在View-Model定义的第一行使用var self=this;
来获取对View-Model对象的引用。
Updated working demo based on your code
检查以下SO问题以便更好地进行处理:
<强> 更新 强>
为了在编写 第一个名称/姓氏文本框时更新您的视图 ,您只需要将valueUpdate: 'afterkeydown'
添加到绑定中。
valueUpdate
如果你的绑定还包含一个名为valueUpdate的参数,那么这个 定义KO应该用来检测更改的其他浏览器事件 除了改变事件。以下字符串值最多 通常有用的选择:
“afterkeydown” - 在用户开始时立即更新您的视图模型 输入一个字符。这可以通过捕获浏览器的keydown事件来实现 并异步处理事件。