Knockout.js 如何从隐藏输入中获取敲除以读取值
我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值。不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便Knockout.js 如何从隐藏输入中获取敲除以读取值,knockout.js,asp.net-mvc-5,Knockout.js,Asp.net Mvc 5,我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值。不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便 self.title = ko.observable() 将隐藏输入的值更改为空白。如果我有一个用户需要填写的空白表单,这就不会那么糟糕了。我在Stackoverflow上找到了一些使用复杂定制绑定的答案,但我就是不相信这么简单的东西需要这么复杂的解决方案。敲除是否有一种本机方式: 从DOM读取输入的现有值 绑定现有值,而不首先将其
self.title = ko.observable()
将隐藏输入的值更改为空白。如果我有一个用户需要填写的空白表单,这就不会那么糟糕了。我在Stackoverflow上找到了一些使用复杂定制绑定的答案,但我就是不相信这么简单的东西需要这么复杂的解决方案。敲除是否有一种本机方式:
<div class="form-group has-success">
<input type="hidden" id="title" value="@RazorFunction('Title')" data-bind="value:title" />
<label class="control-label" for="message">@RazorFunction('Label')</label>
<textarea class="form-control" placeholder="@RazorFunction('Placeholder')" rows="5" cols="50" data-bind="value:message"></textarea>
<br />
<button class="btn btn-primary" data-bind="click:sendMessage">@RazorFunction('Send')</button>
</div>
我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值
这是完全错误的想法。Knockout从模型生成用户界面(即视图),而不是从用户界面生成模型
不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便
这正是应该发生的事情。用户界面反映了模型的要求
这里的问题是:为什么视图的某些部分与数据模型不一致?纠正这一点,问题就会解决
对于基于敲除的应用程序来说,带有值的隐藏输入是完全不必要的。如果服务器知道需要传输到客户端的值,则不要将其写入HTML。创建/发送包含模型初始化所需的所有值的JSON,让Knockout完成整个UI创建,抵制使用Razor视图创建动态UI的冲动
以下是视图的外观(让Razor实现国际化,这很好):
@RazorFunction('标签')
@RazorFunction('Send')
以及viewmodel:
var Model = function (data) {
var self = this;
self.message = ko.observable(data.message)
self.title = ko.observable(data.title)
self.messages = ko.observableArray(data.messages);
};
其中,
数据
是具有初始值的对象 我会完全忽略隐藏的输入,并将此值作为初始值提供给视图模型
var init = {title: 'foo'};
var Model = function(initial){
var self = this;
self.title = ko.observable(initial.title);
// ...
};
var vm = new Model(init);
如果确实需要保留此隐藏输入,可以尝试在viewmodel初始化之前获取其值
var init = {};
init.title = document.getElementById('title').value;
ko.applyBindings(new Model(init));
在模型集中,self.title=ko.observable(@RazorFunction('title'))。这就是我为解决这个问题所做的。没办法避开这个问题。回答得很好!这很有效,谢谢你。我在为这件事扯我根本不存在的头发。
var init = {};
init.title = document.getElementById('title').value;
ko.applyBindings(new Model(init));