- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
当数据将一个对象链接到一个表单时,我遇到了奇怪的行为,这让我重新质疑数据绑定(bind)到底是什么?
基本上我有一个表单可以创建新公司并更新它们。实际的创建/更新是通过 ajax 完成的,这就是为什么我为这两个目的使用相同的表单。在我必须创建公司的情况下,一切都按我的预期进行。但是,当我必须更新一家公司时,事情并不像我期望的那样运作。请查看以下代码。
这是我的示例表单 HTML:
<div id="result"></div>
<script type="text/x-jsrender" id="CompanyFormTemplate">
<form>
<input type="text" data-link="Company.Name" />
</form>
</script>
这是我的 Javascript 代码:
var app = new CompanyFormContext();
function CompanyFormContext() {
this.Company = {
Name: ''
};
this.setCompany = function (company) {
if (company) {
$.observable(this).setProperty('Company', company);
}
};
};
$(function () {
initPage();
...
if (...) {
// we need to update company information
app.setCompany({ Name: 'Company ABC' });
}
});
function initPage() {
var template = $.templates('#CompanyFormTemplate');
template.link("#result", app);
}
表单输入显示“Company ABC”,但它是空的。但是,如果我在其中输入任何内容,那么 Company.Name 值会发生变化!但是,虽然我希望数据输入绑定(bind)到我的 Company 对象的 Name 属性,但我也希望它知道对(父)Company 对象所做的任何更改,并相应地更新它的数据绑定(bind)到它的 Name 属性。
所以我的问题是我应该如何改变我编写这段代码的方式,以便我可以在根对象和属性上实现数据绑定(bind)?
最佳答案
您遇到的问题是因为在您的场景中,您的路径类似于 Company.Name
为此,您不仅要将数据链接到叶属性的更改,还要链接到涉及替换路径中更高层对象(在本例中为公司)的更改。
为此你需要使用语法 data-link="Company^Path"
.
请参阅本文档主题中的路径:叶更改或深度更改部分: http://www.jsviews.com/#observe@deep .
另请参阅本主题中的示例,例如示例:JsViews with plain objects and array:http://www.jsviews.com/#explore/objectsorvm .
这是您的 jsfiddle 的更新,使用的是语法:https://jsfiddle.net/msd5oov9/2/ .
顺便说一句,FWIW,在你的修复中使用 {^{for}}
您不必使用第二个模板 - 您也可以这样写:
<form class="form-horizontal">
{^{for Company}}
...
<input type="text" data-link="Name" />
{{/for}}
</form>
要在下面的评论中回答您的后续问题,您可以将任何“ block ”标签与模板相关联。使用 tmpl=...
在标签上表示您已决定将 block 内容分离到一个单独的可重复使用的模板中。 (“部分”,如果你愿意的话)。该模板的数据上下文将与 block 内的数据上下文相同。
具体来说,{{include}} {{if}} 和 {{else}} 标签不会移动数据上下文,但 {{for}} 和 {{props}} 会。使用自定义标签,您可以决定...
所以在你的情况下你可以使用 {^{for Company tmpl=.../}}
或 {{include tmpl=.../}}
但在第二种情况下,您引用的其他模板将使用 <input type="text" data-link="Company^Name" />
而不是 <input type="text" data-link="Name" />
.
以下是一些相关链接:
关于javascript - JsViews 如何使数据绑定(bind)发生在根对象及其嵌套属性上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319491/
当我尝试传递具有数字属性的 JavaScript 对象时 { 1: "One", 2: "Two", 3: "Three" } 数据绑定(bind)不呈现属性值,仅呈现示例中的数字 $.templat
使用 JsViews是否可以在数据链接属性中将转换器置于辅助函数之前?有点像这样.. 谢谢! 最佳答案 如果你的意思是想让转换器把你的数据对象的param1字段的值进行转换,然后传递给myConve
我对 jsviews 有疑问。我想绑定(bind)一个元素数组。每个元素都是一个对象。元素是动态添加的。每个元素的一个字段的值基于另一字段计算。怎样才能不每次都刷新数组呢? js: model = {
我正在 JsViews 站点中查看按钮的以下示例 http://www.jsviews.com/#link-button 。当我修改代码以获取输入并在单击按钮时在警报框中显示相同的内容时,辅助函数将在
我喜欢使用 jsviews 绑定(bind)在我的页面上显示两个摘要数据。用户界面将类似于屏幕截图。 用户可以在列表中添加/删除人员,这会影响“人数”的值,并且用户可以在文本框中编辑整数值,总计值将显
简单问题:我正在使用 jsViews 来呈现 HTML 模板。我想要某种翻译。现在我的应用程序返回全局变量“语言”,其值等于:pl || zh || 德。 如何使用全局变量“语言”来减少负责翻译的 J
是否可以从 JsViews 中的数据链接函数中访问父数据? {^{for sections}} ... {^{for itemTypes}} {^{:labe
我有一个字符串数组和一个其属性派生自该数组的对象。例如, var arrayOne = ["One","Two", "Three"]; var objOne = {}; for(var i=0;i {
我想使用JsViews播放html5视频内容,如下所示: html: change muted js: var data = { src:
我想为 html 元素定义一个唯一的 id,我必须将其作为辅助函数的参数传递。 唯一的 ID 是使用另一个辅助函数 (genearteUniqueId) 正确生成的,但我无法将其存储在变量中以重用它并
当底层数据发生变化时,我遇到了 JSViews 模板更新的问题。它涉及使用转换器函数将数据链接到基础数据的跨度。当异步回调到服务器后底层数据发生变化时,跨度文本不会更新。 标记: {^{for the
所以,我只是想在“if”语句中将 int 转换为 bool。我不确定如何实现这一目标。我正在玩的代码如下。 JsFiddle code here HTML: // te
我打算将 JsRender 用于我的单页应用程序,我正在考虑是否应该使用 JsViews 或 Knockout。 JsViews 尚未达到测试版,但两者在速度和功能方面的主要区别是什么? 谢谢! 最佳
我使用 JsViews + spectrumjs colorpicker我必须像这样创建自定义标签: $.views.tags({ spectrum : { template
我有一个像这样的 Javascript 对象字面量 test : { length: 3, text: "Please enter 3 characters" } 我想让文本根据长度动态呈现
我正在编写一个小型 javascript 游戏...为了设置游戏中时间,我有一个变量来保存当前游戏中的日期和时间,我想显示此日期和每秒,以小时为单位增加该日期。 我正在使用 JSViews 进行数据绑
我正在尝试使用 JsViews 为内部循环中的复选框进行双向绑定(bind) 不确定这是否可行。 {^{:text}} {^{for answers ~fieldName=fie
所以 jQuery 模板永远不会超过 beta 版并且 jsRender和 jsViews应该填补空白。我查看了 Boris Moore 发布的示例上this page但我不明白 jsRender 和
我想知道为什么似乎无法正确地记录下来。我在 MVC 中有一个 JSONResult 返回“Job”对象的集合。 “Job”对象的属性之一是字典。我似乎无法弄清楚如何将其添加到“作业”实体模板中,以便我
我使用 jsViews 创建了一个表/网格。每行都有一个编辑按钮,单击该按钮会选择该行并显示输入控件而不是文本值。 如果我使用 data-link="visible{:#parent.parent.d
我是一名优秀的程序员,十分优秀!