2013-04-25 84 views
2

我有一个迪朗达尔部件(热毛巾模板)在App>durandal>widgets>selector 部件的controller.js的代号为“选择”小工具:迪朗达尔小工具“this.settings未定义”

<span> 
<a href="#" data-bind="click: $parent.enableSelect"> Click to enable </a> 

<span data-bind="visible: settings.showTopLevel"> 
    <select data-bind="options: settings.items, optionsText: 'name', optionsCaption: 'Select...', value: settings.selectedTopLevel"></select> 
</span> 
<br/> 

<span data-bind="foreach: settings.items"> 
    <a href="#" data-bind="click: $parent.showSelect"> 
     <span data-bind="text: name"></span> 
    </a> 
</span> 

使用widget的:

<div> 
<h2>Widget Selector:</h2> 
<div data-bind="widget: { kind: 'selector', items: $root.projects }"></div> 

但是我对功能selector.prototype.showSelect符合var selected = this.settings.selectedTopLevel;一些问题,主要错误是:

this.settings是不确定的

另一个问题出现在该行的html :

<a href="#" data-bind="click: $parent.enableSelect"> Click to enable </a> 

Th当点击“点击启用”时,e函数selector.prototype.enableSelect未被调用。

我是Durandal小部件中的新人,非常感谢您的任何帮助!

回答

3

这是一个KO问题。您需要将这些调用包装到函数中的$ parent,以保留我相信的“this”上下文。

+0

我部分解决了这个问题。我不使用原型函数,而是在主函数中使用嵌套函数,但在这行html' Click to enable'中,问题依然存在。 – kuskunko 2013-04-26 16:15:02

+0

我觉得问题是这些都没有更新: this.settings.showTopLevel(true); this.settings.selectedTopLevel(null); 由于某些原因,在durandal小部件中声明的observables不会进入淘汰赛堆栈,也不会被绑定到视图(不知道哪一个)... 不确定为什么。为了获得淘汰赛的可观测数据,我不得不在父级视图模型的级别上在窗口小部件级别声明所需的任何可观察数据,并使用设置来传递它。 让我知道,如果你得到它的工作! – onzur 2013-04-28 11:15:03

0

从评论转贴以上,使更容易阅读:

我认为这个问题是这些没有更新:

this.settings.showTopLevel(true); 
this.settings.selectedTopLevel(null); 

对于在迪朗达尔部件不进入申报某些原因可观测淘汰赛堆栈或不绑定到视图(不知道哪一个)...

不知道为什么呢。为了获得淘汰赛的可观测数据,我不得不在父级视图模型的级别上在窗口小部件级别声明所需的任何可观察数据,并使用设置来传递它。

让我知道,如果你得到它的工作!

+0

在我的Durandal Widget中,knockout observables可以正常工作,但只有在设置下才能正常工作。 – kuskunko 2013-04-29 02:44:08