17

我终于有时间在构建新的 MVC4 应用程序时开始学习 KnockoutJS。我试图找出从视图中已设置的默认值初始化可观察值的最佳方法。

这是一个人为的示例,但我想将 observable 的默认值直接呈现给视图,如下所示:

<input type="hidden" 
       value="@Model.SomeValue"
       data-bind="value: myObservableReference"/>

我知道默认值通常通过以下方式初始化:

model.myObservableReference = ko.obervable("SomeValue");

但是,我想找到一种方法来扩展初始化,这样:

model.myObservableReference = ko.obervable();

如果值存在,将从绑定中读取现有值。

到目前为止,我已经设法让我的 KnockoutJS 代码完全不了解剃刀世界,我想避免以下马虎:

model.myObservableReference = ko.obervable(@Model.SomeValue);

我猜这将通过扩展器或自定义活页夹来处理,但如果有人能指出我正确的方向,将不胜感激。

4

2 回答 2

21

您可以尝试创建自己的自定义绑定处理程序来实现这一点:

ko.bindingHandlers.initializeValue = {
    init: function(element, valueAccessor) {
        valueAccessor()(element.getAttribute('value'));
    },
    update: function(element, valueAccessor) {
        var value = valueAccessor();
        element.setAttribute('value', ko.utils.unwrapObservable(value))
    }
};

<input type="hidden" value="@Model.SomeValue"
       data-bind="initializeValue:myObservableReference, value: myObservableReference"/>
于 2012-07-22T01:16:18.640 回答
1

对于您的 googlers,这里是将 initializeValue 绑定扩展到选择框和输入框的代码

ko.bindingHandlers.initializeValue = {
    init: function(element, valueAccessor) {
        if (element.getAttribute('value')) {
            valueAccessor()(element.getAttribute('value'));
        } else if (element.tagName === 'SELECT') {
            valueAccessor()(element.options[element.selectedIndex].value);
        }
    },
    update: function(element, valueAccessor) {
        var value = valueAccessor();
        element.setAttribute('value', ko.utils.unwrapObservable(value));
    }
}

注意:initializeValue 绑定应该出现在您选择的数据绑定属性中的值绑定之前,否则它将不起作用。

<select data-bind='initializeValue: layout_id, value: layout_id, options: layouts, optionsText: "text", optionsValue: "id"'></select>
于 2014-09-26T15:50:43.600 回答