最近我收到了来自其他开发人员的一堆代码,我应该使用它来构建其他功能。不幸的是我无法在本地运行它。奇怪的是,我应该使用的门户在服务器上完美运行,但是当我尝试在本地运行它时,我得到以下异常
Uncaught Error: Unable to parse bindings.
Message: SyntaxError: Unexpected identifier;
Bindings value: css: {
'make-primary':(lala.viewModels.transacFilterTabsViewModel.getSyncList().resultsetLength() > 0 && !lala.viewModels.transacQuickactionsViewModel.operationInProgress() && (lala.viewModels.transacFilterTabsViewModel.getSyncList().captureButtonIsEnabled() || lala.viewModels.transacFilterTabsViewModel.getSyncList().refundButtonIsEnabled()Â || lala.viewModels.transacFilterTabsViewModel.getSyncList().abortButtonIsEnabled())),
我注意到的一个奇怪的事情就是围绕.refundButtonIsEnabled()阻止了一个奇怪的字符(“”),这个字符对我的代码是不可见的,直到我使用google chrome dev控制台工具。因此我的理论是我的localhost设置可能有问题。
为了运行此代码我正在使用:
Mac OSX El capitan
Netbeans 8.1
Apache 2(httpd24)
运行代码时没有任何错误的Grunt
Knockout 2.0
我的HTML代码是:
<div class="span6 actions-panel-bottom" data-bind="css: {
'make-primary': (lalal.viewModels.transacFilterTabsViewModel.getSyncList().resultsetLength() > 0 && !lalal.viewModels.transacQuickactionsViewModel.operationInProgress() && (lalal.viewModels.transacFilterTabsViewModel.getSyncList().captureButtonIsEnabled() || lalal.viewModels.transacFilterTabsViewModel.getSyncList().refundButtonIsEnabled()|| lalal.viewModels.transacFilterTabsViewModel.getSyncList().abortButtonIsEnabled()))">
并且
'parseBindingsString': function(bindingsString, bindingContext, node) {
try {
var bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache);
return bindingFunction(bindingContext, node);
} catch (ex) {
throw new Error("Unable to parse bindings.\nMessage: " + ex + ";\nBindings value: " + bindingsString);
}
}
});
我想提一下,在代码失败之前,其他几个绑定将成功运行并停在'make-primary'处,它将添加这个奇怪的字符。
先谢谢你!如果您有任何关于如何调试这种情况的提示,我将非常感激!
答案 0 :(得分:0)
似乎与KO 2.0具体相关。我在那里得到一个错误,但不是3.0。这是一个非常神可怕的约束力。通常,绑定应该是简单的表达式,复杂的表达式应该在您的viewmodel中。
是否有理由无法更新Knockout版本?
下面的片段只是一个最小的复制品。将其复制到新的代码段并在更改版本和运行时观察控制台。
Handler
/**
* Determine if string 2 overlaps string 1 at all
* @param st1 The first string to check.
* @param st2 The second string to check
* @param n The minimum number of characters.
* @return The character index in string 2 that
* overlaps with something in string 1
* a -1 indicates no overlap
*/
static int st1Pos;
static int st2Pos;
static int getOverlap(String st1, String st2, int n)
{
st1Pos = -1;
st2Pos = -1;
if ((n <= 0) || (st1.length() < n) || (st2.length() < n))
{
return -1;
}
int index;
for (int i = 0; i < st1.length() - n; i++)
{
String sub = st2.substring(i, i + n);
index = st2.indexOf(sub);
if (index >= 0)
{
st1Pos = index;
st2Pos = i;
return i;
}
}
return -1;
}