javascript - Knockout.js 文本将多个属性绑定(bind)到单个 <p> 节点

标签 javascript knockout.js data-binding

我需要绑定(bind)一个<p>标记到我的 View 模型中的值。 现在通常这不是问题,但在这种情况下,该值被分成模型内的多个字段,因为它是一个地址。

因此,我将“streetName”和“HouseNumber”作为单独的字段,但它们都需要作为此

标记的一部分显示在 HTML 中。

根据knockout.js的 official documentation :

“绑定(bind)值可以是单个值、变量或文字或几乎任何有效的 JavaScript 表达式。”

现在我注意到那里的“几乎”,所以我有所保留,但是简单的字符串连接应该被认为是“足够简单的操作”,是吗?我需要绑定(bind)我的 <p> 的值标记到模型中两个字符串字段的值,我将使用什么语法,因为我正在尝试的语法不起作用:

<p data-bind="text: dataBind1 + dataBind2"></p>

旁注 dataBind1 和 dataBind2 并不是那么简单,它是一个嵌套函数调用,yadda,yadda,yadda,尽管它们在分开时工作得很好,但我不能,因为我死了才能让它们工作,当我希望它们“在一起”在一个元素中。真正的绑定(bind)值是:

<p data-bind="text: getModelData(processID).Property()[0].Street + getModelData(processID).Property()[0].HouseNumber"></p>

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

View 模型本身是一个 JavaScript 对象 ( var viewModel ),它具有某些方法,例如 getModelData(ID)、updateModelData(ID) 等。这里传递的 ID 是页面不同部分的 Controller 的“唯一 Controller 标识符”。这里有一些 1:1 vs 1:M 的胡言乱语,但这并不相关。 var viewModel接收来自 AJAX 调用的信息,并使用附加属性动态更新自身,基于这些属性将 Controller 插入页面。因此它会具有“uniqueID”属性,这实际上是 knockout 的 View 模型。
这样,所有 View 模型都保存在单个对象的“界面”下。像这样的事情:

  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 几乎相同在常规的非深层嵌套模型或任何你想称之为的模型中。而knockout对象本身的结构有些类似:

{
    Property: [
    {
        Street: "someStreet1"
        HouseNumber: "someNumber1"
    },
    {
        Street: "someStreet2"
        HouseNumber: "someNumber2"
    },
    {
        Street: "someStreet3"
        HouseNumber: "someNumber3"
    },
    ]

}

最佳答案

您必须发送一个值、函数(返回值)或表达式。

示例:

<p data-bind="text: (dataBind1() + dataBind2())"></p>

应该导致评估在可观察的更新上重新运行。我只知道少数情况不会。

此外,您可以使用计算值,以保证可观察的更新将重新计算该值。这也使逻辑远离标记,并且更适合较新的浏览器安全策略。请参阅 @Matt.kaaj 对该解决方案的回答。

最后,您可以使用像 span 这样的子元素,它不会影响标记,并且在语义上是最正确的。

<p><span data-bind="text: dataBind1"></span> <span data-bind="text: dataBind2"></span></p>

关于javascript - Knockout.js 文本将多个属性绑定(bind)到单个 <p> 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104138/

相关文章:

javascript - 如何阻止构造函数中的订阅调用直到完成?

javascript - Instagram Stories API 中的 'user' 是谁

jquery - Knockout.js 获取与数据关联的 dom 对象

javascript - JavaScript 中的功能范围和 "this"

javascript - Onclick CSS 替代方案

javascript - axios、数组参数和 CORS

javascript - KOValidation get observable value, $index(), $data 等错误信息

c# - 为什么我的数据绑定(bind) TabControl 看起来不像我的非数据绑定(bind) TabControl?

java - 将 javaFX DoubleProperty 格式设置为 -100.00

Android数据绑定(bind)包括来自不同模块的布局