【发布时间】:2017-11-29 12:17:50
【问题描述】:
前段时间我一直在使用这种类型的绑定(使用 knockout.js),一切正常,但今天出现了一个新问题。即:
我有一个相当复杂的视图模型,它具有基于某个过程参数的“部分”。整个视图模型“绑定”到页面,但任何进程只使用它自己的部分。简单地说,想象这是你的视图模型:
{
1: Object (actual view model)
2: Object (actual view model)
3: Object (actual view model)
6: Object (actual view model)
getModelData = function(paramNumber) //returns the view model)
extractJSObject = function(paramNumber) //console.logs a "JS" object
}
现在,大多数教程中常用的数据绑定语法如下:
<input data-bind="value: displayedValue">
视图模型中存在一个名为 displayValue 的可观察视图模型。然而,我使用的语法遵循以下规则:
<input data-bind="value: getModelData( processID ).DataSets. nameOfDataSet ()[ indexOfDataElement ]. fieldName">
举个例子:
<input data-bind="value: getModelData(1).DataSets.Countries()[0].CountryPhoneCode">
现在,由于某种原因,这似乎不起作用,以前它曾经起作用。主要是 getModelData() 函数 存在于绑定到 HTML 的 viewModel 中,它确实返回它需要的任何东西,所以不要被这个混淆,它是一个常规绑定,就像你是绑定任何其他对象,但我假设稍后会在某处得到#@#cked。
图像显示了控制台错误消息,以及我返回预期结果的两行代码,为什么我自己在控制台中键入可以正常工作,但模型仍然无法绑定自己,这超出了我的理解。
编辑:最后一件事,在 HTML 中,绑定不是在控制台中显示为错误,绑定是这样的:
<input data-bind="value: getModelData(6).DataSets.HumanUser()[0].Address">
【问题讨论】:
-
您的任何数据是否异步加载?我很好奇绑定是否在数据存在之前触发,但是一旦您在控制台中签入它就有时间加载。
-
另外你用的是什么版本的jQuery?
-
通常,在这种情况下,我会右键单击 UI 中要检查其视图模型的元素,选择“检查”,然后使用
ko.dataFor($0)来查看其中的确切内容。在您的情况下,ko.dataFor($0).getModelData(6).DataSets.HumanUser()[0].Address可以准确查看淘汰赛所看到的内容(而不是做出任何假设) -
如果在绑定前添加
data-bind="text: console.log(getModelData(6)"会怎样? -
@JasonSpake 好的,所以更新,JQuery 显然不是本地的,早期使用的版本是从这里获取的:
<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js\"></script>我假设是 1.12。然而,最近的变化让我们切换到:<script src=\"https://code.jquery.com/jquery-3.1.1.slim.min.js\" integrity=\"sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n\" crossorigin=\"anonymous\"></script>这是由从 bootstrap 3 到 boostrap 4 的过渡引起的。现在 jQuery 的变化超出了我的范围。
标签: javascript mvvm knockout.js