Knockout.js 如何扩展knockout观测值以从绑定中读取默认值?

Knockout.js 如何扩展knockout观测值以从绑定中读取默认值?,knockout.js,asp.net-mvc-4,Knockout.js,Asp.net Mvc 4,我终于有时间开始学习KnockoutJS,同时构建一个新的MVC4应用程序。我试图找出从视图中已设置的默认值初始化可观察值的最佳方法 这是一个人为的示例,但我想直接向视图呈现一个可观察的默认值,如下所示: <input type="hidden" value="@Model.SomeValue" data-bind="value: myObservableReference"/> 但是,我想找到一种方法来扩展初始化,以便: model.myObserv

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

这是一个人为的示例,但我想直接向视图呈现一个可观察的默认值,如下所示:

<input type="hidden" 
       value="@Model.SomeValue"
       data-bind="value: myObservableReference"/>
但是,我想找到一种方法来扩展初始化,以便:

model.myObservableReference = ko.obervable();
如果存在值,将从绑定中读取现有值

到目前为止,我一直设法让我的KnockoutJS代码完全不了解razor世界,因此我希望避免以下粗枝大叶的情况:

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

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

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

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"/>
ko.bindingHandlers.initializeValue={
init:函数(元素、值访问器){
valueAccessor()(element.getAttribute('value');
},
更新:函数(元素、值访问器){
var value=valueAccessor();
element.setAttribute('value',ko.utils.unwrapobbservable(value))
}
};

对于谷歌用户来说,下面是将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的数据绑定属性中的值绑定之前,否则它将不起作用。

<select data-bind='initializeValue: layout_id, value: layout_id, options: layouts, optionsText: "text", optionsValue: "id"'></select>


这段代码看起来很熟悉=)@Tyrsius-是的,这似乎是一个重复的问题。我很惊讶我没有看到它,因为在我发布这个问题之前,我实际上在谷歌上搜索了一段时间。伙计,我直到现在才注意到它,但是科德克尔问了这个问题。我应该多加注意。只有当“initializeValue”在“value”之前时,这才有效吗?卡尔加里,虽然这样做有时很有用,但在大多数情况下,最好将模型序列化为JSON,并使用它来构造viewmodel,以便它从值开始,而不是试图从视图中读取它。MVVM实践是,视图不应包含数据。可能的重复
<select data-bind='initializeValue: layout_id, value: layout_id, options: layouts, optionsText: "text", optionsValue: "id"'></select>