Knockout.js文本将多个属性绑定到单个<p>节点

时间:2016-06-29 15:34:26

标签: javascript knockout.js data-binding

我需要将<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>

编辑(稍微澄清viewModel的结构):

视图模型本身是一个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"
    },
    ]

}

2 个答案:

答案 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>