我需要将<p>
标记绑定到我的视图模型中的值。
现在通常这不是问题,但在这种情况下,值会在模型中分成多个字段,因为它是一个地址。
所以我将“streetName”和“HouseNumber”作为单独的字段,但它们都需要在HTML中显示为此
标记的一部分。
根据knockout.js的 official documentation:
“绑定值可以是单值,变量或文字或几乎任何有效的JavaScript表达式。”
现在我注意到“差不多”了,所以我保留了,但是简单的字符串连接应该被认为是“足够简单的操作”是吗?我需要将我的<p>
标记的值绑定到模型中两个字符串字段的值,我会使用什么语法,因为我正在尝试的那个不起作用:
<p data-bind="text: dataBind1 + dataBind2"></p>
在旁注dataBind1和dataBind2并不是那么简单,它是一个嵌套的函数调用,yadda,yadda,yadda,虽然它们在分离时工作得非常好,我不能,因为我的死让他们工作的时候我希望他们在一个元素中“在一起”。实际绑定值为:
<p data-bind="text: getModelData(processID).Property()[0].Street + getModelData(processID).Property()[0].HouseNumber"></p>
视图模型本身是一个JavaScript对象(var viewModel
),它具有某些方法,例如getModelData(ID),updateModelData(ID)等。这里传递的ID是页面不同部分的控制器的“唯一控制器标识符”。这里有一些1:1 vs 1:M mummbo jumbo,但它并不相关。 var viewModel
接收来自AJAX调用的信息,并根据哪些控制器被卡入页面,使用其他属性动态更新自身。所以它会有“uniqueID”属性,实际上是淘汰赛的视图模型
这样,所有视图模型都保存在单个对象的“接口”下。像这样:
var viewModel = {
uniqueID: object, //knockout.js viewModel of Controller1
uniqueID2: object, //knockout.js viewModel of Controller2
getModelData(processID): function(){
//does stuff
}
}
因此,在这种情况下,访问getModelData(ID).Property()[0].Street
与访问常规非深层嵌套模型中的Property()[0].Street
或您想要调用的任何内容几乎相同。而淘汰对象本身的结构有点类似于:
{
Property: [
{
Street: "someStreet1"
HouseNumber: "someNumber1"
},
{
Street: "someStreet2"
HouseNumber: "someNumber2"
},
{
Street: "someStreet3"
HouseNumber: "someNumber3"
},
]
}
答案 0 :(得分:2)
您必须发送值,函数(返回值)或表达式。
示例:强>
<p data-bind="text: (dataBind1() + dataBind2())"></p>
此应该会导致评估重新运行在可观察的更新上。我只知道一些不会发生的情况。
此外,您可以使用计算值来保证可观察更新将重新计算该值。这也使逻辑远离标记,并且对于较新的浏览器安全策略更好。请参阅@ Matt.kaaj对该解决方案的回答。
最后,您可以使用像span
这样的子元素,它们不会影响标记,并且在语义上最正确。
<p><span data-bind="text: dataBind1"></span> <span data-bind="text: dataBind2"></span></p>
答案 1 :(得分:0)
我不知道你的View模型如何,但这是你可以做的。
var MainViewModel = function (){
var self = this;
self.Street = ko.observable(getModelData(processID).Property()[0].Street);
self.HouseNum = ko.observable(getModelData(processID).Property()[0].HouseNumber);
self.FullAddress= ko.computed(function () {
return self.Street() + ", " + self.HouseNum();
});
}
HTML
<p data-bind="text: FullAddress"></p>