KnockoutJs:将数据绑定值传递给javascript变量/对象

时间:2012-07-06 15:29:48

标签: javascript knockout.js

我对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的其他方面使用它吗?

2 个答案:

答案 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的值。