如何扩展knockout observables以从绑定中读取默认值?

Chr*_*ter 17 asp.net-mvc-4 knockout.js

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

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

<input type="hidden" 
       value="@Model.SomeValue"
       data-bind="value: myObservableReference"/>
Run Code Online (Sandbox Code Playgroud)

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

model.myObservableReference = ko.obervable("SomeValue");
Run Code Online (Sandbox Code Playgroud)

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

model.myObservableReference = ko.obervable();
Run Code Online (Sandbox Code Playgroud)

如果存在值,则会从绑定中读取现有值.

至于我到目前为止设法让我的KnockoutJS代码完全不知道剃刀世界,我想避免以下的邋::

model.myObservableReference = ko.obervable(@Model.SomeValue);
Run Code Online (Sandbox Code Playgroud)

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

Kod*_*hor 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"/>
Run Code Online (Sandbox Code Playgroud)

  • 这段代码看起来很熟悉=)http://stackoverflow.com/questions/11526216/initialize-knockout-observable-from-element-attribute-value/11526775#11526775 (5认同)
  • 男人我直到现在才注意到它,但是KodeKreacher问了这个问题.我应该多加注意. (4认同)