更正knockout.js中字段值的正确方法

时间:2013-12-31 20:48:39

标签: asp.net asp.net-mvc knockout.js

我的模特 -

public class Model2
        {
            public String Text1;
            public String Text2;
        }

行动方法 -

public ActionResult Index()
        {
            Model2 model = new Model2();
            model.Text1 = "a";
            return View("Index2", model);
        }

html -

<input id="text1" type="text" data-bind='value: Text1, keyup: OnText1Change'>
        <input id="text2" type="text" data-bind='value: Text2'>
        <button onclick="PostIndex2Data()">Post Data</button>
<script type="text/javascript">
        var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
        BindIndex2Data();
</script>

javascript -

function BindIndex2Data() {
    viewModelData = ko.mapping.fromJS(data);

   viewModelData.OnText1Change = function () {
    var value = viewModelData.Text1;
    value = value + 1;//or perform some claculation here
    viewModelData.Text2 = ko.observable(value);
    }

    ko.applyBindings(viewModelData);
}

我在这里尝试的是从text1获取值,对该值执行一些计算并将该值分配给text2

这是在淘汰赛中实施"ontextchange"事件的正确方法吗?

出于某种原因,我的OnText1Change事件未在此处调用。请帮忙!

1 个答案:

答案 0 :(得分:0)

Knockout是一个双向绑定框架。您不处理更改数据的事件,您只需设置您的viewmodel和绑定并信任它为您完成工作。首先,您需要删除keyup: OnText1Change并删除函数viewModelData.OnText1Change

要更改observable的值,在首次使用viewModelData.Text2 = ko.observable('')创建它之后,可以将其称为函数:

viewModelData.Text2(value);

如果您希望text2的值取决于文本1的值,则可以这样定义:

viewModelData.Text2 = ko.computed(function(vm) {
    return vm.Text1() + "something";
}, viewModelData);

如果要绑定text2,并且还能够以编程方式更新它:

viewModelData.Text1.subscribe(function(value) {
    viewModelData.Text2(value + "something");
});