使用淘汰赛和durandal的动态构图不起作用

时间:2013-11-03 08:25:40

标签: knockout.js durandal knockout-2.0 durandal-navigation

使用Durandal / Knockout时我遇到了一个奇怪的问题。在某些情况下,绑定不能正常工作。我已经简化了这个问题所带来的情况。

我在我的代码中的某处设置了组合信息,如:

compositionInfo({
    model: viewModelInstance,
    view: viewName,
    activate: viewModelInstance.activate
    });

这是我的观点:

<div id="service-container" 
    data-bind="compose: { model: compositionInfo().model,
                          view: compositionInfo().view, 
                          activate: compositionInfo().activate}">

第一次,作文很好。但是在下一次compositionInfo更改时(使用相同的行并在代码的相同位置),没有任何反应。

第一次在日志窗口中有["Activating",...]。但是第二次没有这样的日志或["Binding"]日志。

我已经跟踪了Durandal和Knockout代码并发现在knockout-2.3.0.debug文件中有一个evaluateImmediate()函数,它在第一次运行此行(正确的):

var newValue = readFunction.call(evaluatorFunctionTarget);

并使合成开始激活模型。

但是当它在evaulateImmediate()中不起作用时,它会通过此代码返回上面的一些行:

// Don't dispose on first evaluation, because the "disposeWhen" callback might
// e.g., dispose when the associated DOM element isn't in the doc, and it's not
// going to be in the doc until *after* the first evaluation
if (_hasBeenEvaluated && disposeWhen()) {
    dispose();
    return;
}

这段代码是什么? 如果我评论这些行,一切正常。

此问题因计算机而异。在大多数情况下,在我的电脑上,它只是第一次工作。但在其他计算机上,它大部分时间都可以工作,并且大约有3/10个案例失败。

仅供参考我正在使用Durandal 1.1.1和Knockout 2.3.0

2 个答案:

答案 0 :(得分:0)

我在compositioninfo中看到了一个问题。 activate的值应该为true或false,并且viewModelInstance.activate函数本身将通过组合绑定找到/调用。

以下是相关文档的链接 - https://github.com/BlueSpire/Durandal/blob/master/docs/1.2/Composition.html.md#activate

这是您尝试创建代码的简化版本时的错误/问题吗?

compositionInfo({
    model: viewModelInstance,
    view: viewName,
    activate: true
});

答案 1 :(得分:0)

正如我在问题中所提到的,使用durandal 1.2唯一的方法来进行正确的绑定是赞扬这些界限:

// Don't dispose on first evaluation, because the "disposeWhen" callback might
// e.g., dispose when the associated DOM element isn't in the doc, and it's not
// going to be in the doc until *after* the first evaluation
if (_hasBeenEvaluated && disposeWhen()) {
    dispose();
    return;
}

但升级到Durandal 2.0.1后,这些注释行会导致一些激活不止一次发生。

因此,请注意,如果升级到2.0.1,请取消注释这些行,或者只获取原始的knockout代码。