我对knockoutjs感到有些困惑。我已经完成了大部分教程,并对如何使用它有一般性的了解。我可以很好地操作UI,但我无法理解的是KO如何与KO之外的其他javascript函数进行通信。
我认为我的目标相当简单明了。我需要用户从一系列单选按钮中选择的单选按钮的值。这就是我所拥有的。
HTML
<input type="radio" name="templateStyle" value="DR.php" data-bind="checked: tempStyle">
<input type="radio" name="templateStyle" value="DRH.php" data-bind="checked: tempStyle">
<input type="radio" name="templateStyle" value="PS.php" data-bind="checked: tempStyle">
<p>The template style selected is <span data-bind="text: selectedStyle"></span></p>
<button id="submitTemplate">Submit Template</button>
JS
var radioValue = { rv: "" };
function viewModel() {
var self = this;
self.tempStyle = ko.observable("DR.php");
self.selectedStyle = ko.computed(function() {
return self.tempStyle();
},
self
);
return self.selectedStyle();
}
ko.applyBindings(new viewModel());
$("#submitTemplate").click(function() {
radioValue.rv = viewModel();
console.log(radioValue.rv);
});
这在UI方面工作正常,但radioValue.rv
对象只保留在“DR.php”。如何更新此对象以反映data-bind="text: selectedStyle"
值?
我尝试了radioValue.rv = ko.toJS(viewModel())
的各种变体,但这不起作用。
如果这是完全错误的,我如何获取templateStyle单选按钮的值?所以我可以在我的javascript的其他方面使用它吗?
答案 0 :(得分:1)
我原来的问题未经编辑,因为它显示了我的错误。
我简直不敢相信我花了2天时间来解决这个问题,但现在就是这样。
HTML
<input type="radio" name="templateStyle" value="DR.php" data-bind="checked: tempStyle">
<input type="radio" name="templateStyle" value="DRH.php" data-bind="checked: tempStyle">
<input type="radio" name="templateStyle" value="PS.php" data-bind="checked: tempStyle">
<p>The template style selected is <span data-bind="text: selectedStyle"></span></p>
<button id="submitTemplate" data-bind="click: submitTemplate">Submit Template</button>
JS
var radioValue = { rv: "" };
function viewModel() {
var self = this;
self.tempStyle = ko.observable("DR.php"); // Set default selected radio button
self.selectedStyle = ko.computed(function() {
return self.tempStyle(); // Update viewModel to reflect user input
},
self
);
self.submitTemplate = function() {
radioValue.rv = self.tempStyle(); // Return user input on button click
console.log(radioValue.rv); // JS object can now be used anywhere
};
}
ko.applyBindings(new viewModel());
基本上,我试图在viewModel
以外的地方工作到早期。
我现在看到了光明,并明白为什么淘汰赛如此优秀。
答案 1 :(得分:0)
我的淘汰赛有点模糊,但我希望这会有所帮助。你什么时候这样:
return self.tempStyle();
它正在调用tempStyle。 tempStyle是ko.observable("DR.php")
,所以实际返回的是ko.observable("DR.php")()
,也就是说,它获取了observable的值,而不是observable本身。
尝试删除parens:
return self.tempStyle;
这样,radioValue.rv将被分配给observable本身,而不是observable的值。