新的绑定预处理功能如何在Knockout 3.0中运行?

时间:2013-11-20 21:33:19

标签: knockout.js

因此最新的Knockout附带了一个新的binding pre-processing feature。它表示,与initupdate方法一起,绑定可以采用preprocess方法,该方法需要valuenameaddBinding打回来。这一切都很好而且整洁,但是

  • 如何解析这些valuename?他们只是用逗号分开吗?
  • 什么语法对他们来说是安全的?
  • 我可以期望从绑定字符串中正确提取任意JSON文字作为value的值吗?

修改

我们知道绑定字符串可以包含多个绑定表达式。那么当一个表达式结束而另一个表达式开始时,KO如何知道?我们可以假设绑定表达式应该是一个由逗号分隔的有效键值对,并且右侧有一个有效的javascript表达式,但是文档显示的示例#1并非如此。好吧,如果它是什么不同于它是什么?

2 个答案:

答案 0 :(得分:2)

您获得 valuename字符串,其中包含您在视图中的绑定中所写的文本,因此不涉及解析。

来自文档:

  

value:与Knockout之前的绑定值相关联的语法   尝试解析(例如, yourBinding:1 + 1 ,相关联   值“1 + 1”为字符串)。

     

name:绑定的名称(例如, yourBinding:1 + 1 ,名称   将“yourBinding”作为字符串)。

您可以轻松地创建一个简单的示例:

ko.bindingHandlers.myFancyBinding = {
    preprocess: function (value, name, addBindingCallback) {
        console.log(value);
        console.log(name);
        return value;
    }
}

如果你这样使用它:

<div data-bind="myFancyBinding: 1+2+'some crazy expresssion'"></div>

输出将是:

1+2+'some crazy expresssion'
myFancyBinding  

演示JSFiddle

答案 1 :(得分:1)

当绑定字符串包含多个绑定时,绑定用逗号分隔。因此,a, b被解释为两个绑定ab。在每个绑定中,名称和值由冒号分隔。因此,a: b是名为a和值b的单个绑定。如果不存在冒号,则绑定的值为undefined

名称可以指定为字符串,在这种情况下,它可以包含除引号之外的任何字符:'some crazy binding :-)': true。如果没有引号,它可能包含除以下,:/'"()[]{}之外的任何字符。

值可以是任何有效的JavaScript表达式,只要没有顶级逗号即可。只要引号和左括号,括号和大括号匹配且没有顶级逗号,它也可以是任何值。例如,如果您的绑定为a: happy :-),则提供给preprocess的值将为happy:-)(对于运算符字符,空格不重要)。但是,如果它不是有效的JavaScript,则必须通过preprocess函数将其转换为有效的JavaScript。