Knockout.js 如何扩展knockout观测值以从绑定中读取默认值?
我终于有时间开始学习KnockoutJS,同时构建一个新的MVC4应用程序。我试图找出从视图中已设置的默认值初始化可观察值的最佳方法 这是一个人为的示例,但我想直接向视图呈现一个可观察的默认值,如下所示: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
<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>