Performance 增加和钩住脱模装订机构

Performance 增加和钩住脱模装订机构,performance,knockout.js,Performance,Knockout.js,这是我很长一段时间以来一直在努力做的事情。我已经做了一些事情,但我确信有更好的方法 问题 我希望能够连接到bindingProvider过程中,用前缀(或类似的东西)来增加可观察对象的名称 因此,如果我有: 我希望能够拦截绑定的进程,并将标签替换为myLabel,因此它基本上被处理为: 这是基于应用于节点的ViewModel上的一些数据而得出的 尝试 使用预处理节点,并在KO到达标签之前,将其值替换为myLabel 显然,我希望避免这样做,特别是因为myLabel只能在某些情况下使用,因

这是我很长一段时间以来一直在努力做的事情。我已经做了一些事情,但我确信有更好的方法

问题

我希望能够连接到
bindingProvider
过程中,用前缀(或类似的东西)来增加可观察对象的名称

因此,如果我有:


我希望能够拦截绑定的进程,并将
标签
替换为
myLabel
,因此它基本上被处理为:


这是基于应用于节点的ViewModel上的一些数据而得出的

尝试

  • 使用
    预处理节点
    ,并在KO到达
    标签
    之前,将其值替换为
    myLabel

    显然,我希望避免这样做,特别是因为
    myLabel
    只能在某些情况下使用,因为它基于ViewModel上的动态数据

    此外,没有可用的
    bindingContext
    参考,因此我不确定如何访问ViewModel

  • 使用自定义
    bindingProvider
    并在
    getBindings

  • 使用
    预处理
    并增加值

    如果不是为了两件事,这将是一个完美的选择:我必须对所有绑定重复这一点,因为表单是
    ko.bindingHandlers..preprocess
    它不会给我
    bindingContext
    ,所以我不能使用该ViewModel数据:)

  • 使用扩展器

    问题是,我需要将增强行为应用于所有可观察值,而不仅仅是特定值。默认情况下

  • 有什么建议吗?

    多谢各位

    示例

    为了进一步说明需求,假设我有一个如下所示的模板:

    <ul data-bind="foreach: people">
        <li>
            <span data-bind="text: name"></span>,
            <span data-bind="text: age"></span>
        </li>
    </ul>
    
    {
        people: [
            {name: 'John', age: 30},
            {name: 'Dean', age: 40},
            {age: 0.2}
        ]
    }
    
    ko.bindingHandlers.customText = {
        update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var field = ko.unwrap(valueAccessor())
            element.innerText = ko.unwrap(viewModel[field]);
        }
    }
    
    基本上,有人,其中一些人刚刚出生,还没有名字。 我希望能够为那些无名的1岁以下的人返回类似“noname”的东西

    很明显,我可以通过更改模板来完成,但这是我不想做的事情。该模板可重复用于基于性别而不是年龄或类似内容打印非姓名的内容


    希望能有所帮助。

    解决此特定用例的另一种方法是自定义绑定,它将属性名称作为字符串,并使用绑定处理程序的
    viewModel
    参数将文本设置为给定属性

    像这样的绑定可能如下所示:

    <ul data-bind="foreach: people">
        <li>
            <span data-bind="text: name"></span>,
            <span data-bind="text: age"></span>
        </li>
    </ul>
    
    {
        people: [
            {name: 'John', age: 30},
            {name: 'Dean', age: 40},
            {age: 0.2}
        ]
    }
    
    ko.bindingHandlers.customText = {
        update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var field = ko.unwrap(valueAccessor())
            element.innerText = ko.unwrap(viewModel[field]);
        }
    }
    
    这里有一个完整的例子


    您还可以执行比直接属性名查找更复杂的操作—您甚至可以将函数传递给绑定,该绑定将视图模型作为参数并返回相关数据。

    因此,observable是一种方法,感谢所有建议它的人

    最后,我的一位同事想出了一个主意,结果证明这是一个非常巧妙的简单把戏(而我正因为自己在这个问题上昏厥而自责)

    这个想法是基于创建一个
    标签
    mylabel
    可观察而计算的。这在大多数情况下都有效,除了ViewModel已经有一个不相关的
    标签
    observable
    ,然后该标签将被computed覆盖,这可能是不需要的

    对于我要映射到的ViewModel observable(在上面的示例中,
    myLabel
    ),您可以创建一个名为
    label
    (这样模板仍然可以像以前一样工作)的computed,而不是原始的
    label
    ,但技巧是将
    label
    observable添加到ViewModel 这样-此ViewModel应用到的所有其余元素将使用其具有的
    标签
    值,并且对于此特定模板,新的
    标签
    计算将阴影化“旧”元素,这是所需的效果

    基本上:

    var Context = function() {
       // create computed observable `label` for observable `myLabel`
       // based on whatever ViewModel data is needed.
    };
    
    Context.prototype = ViewModel;
    
    var context = new Context();
    
    ko.applyBindings(context, node);
    

    目前,我认为您必须使用自定义的
    bindingProvider
    ,并在
    getBindingAccessors
    函数中完成工作。一种方法可能是操作节点的绑定字符串(通过使用字符串和上下文),然后调用默认绑定提供程序函数来解析绑定。@RPNiemeyer谢谢Ryan。这是我希望避免的事情。你能不能用一个可观测的计算机来实现这一点?如果无法更改viewmodel对象(无论出于何种原因),则可以更改绑定以绑定到全局函数的返回值,将对象和属性名作为参数传递给函数。我写了一个样本,展示了我的想法,可以在网站上看到。但是如果可能的话,我可能会建议使用计算的可观测值。@robert.westerlund计算的可观测值是有问题的,因为ViewModel是动态的。您有一个带有数据绑定的模板,并将ViewModels连接到该模板-一些模板具有
    文本
    属性,因此模板可以按原样工作,一些模板具有
    描述
    属性(或其他所有属性),并且必须在模板中进行调整。我正试图通过在某些配置级别上告诉您,对于此特定的ViewModel,应该从
    描述
    字段中获取
    文本
    ,来进行按摩。相当令人困惑,但事实就是如此。@robert.westerlund我看到了你的例子。非常感谢。但这违背了仅仅将
    文本
    作为可观察对象的名称并赋予其语义的目的。我想有两种方法可以做到这一点——语义清理模板或语义清理javascript。我喜欢前者。谢谢。当然,这是一个微不足道的解决方案。稀薄的