【问题标题】:Durandal widget "this.settings is undefined"Durandal 小部件“this.settings 未定义”
【发布时间】:2013-04-28 19:15:47
【问题描述】:

我在App>durandal>widgets>selector 中有一个名为“selector”的 Durandal 小部件(热毛巾模板) widget的controller.js代码:

define(function (require) {
var widget = require('durandal/widget');

var selector = function (element, settings) {
    settings.selectedTopLevel = ko.observable();
    settings.showTopLevel = ko.observable(true);

    this.settings = settings;
};

selector.prototype.enableSelect = function() {
    this.settings.showTopLevel(true);
    this.settings.selectedTopLevel(null);
};

selector.prototype.showSelect = function () {
    var selected = this.settings.selectedTopLevel;
    alert(this.selected.name().toString());
};

return selector;
});

widget的view.html:

<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>

但我在var selected = this.settings.selectedTopLevel; 行中的函数selector.prototype.showSelect 有一些问题,主要错误是:

this.settings 未定义

另一个问题出现在那行html中:

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

当我点击“点击启用”时,函数selector.prototype.enableSelect没有被调用。

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

【问题讨论】:

    标签: widget durandal hottowel


    【解决方案1】:

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

    【讨论】:

    • 我部分解决了这个问题。我没有使用原型函数,我在主体函数中使用了嵌套函数,但是在这行 html &lt;a href="#" data-bind="click: $parent.enableSelect"&gt; Click to enable &lt;/a&gt; 中问题仍然存在。
    • 我认为问题是这些没有更新:this.settings.showTopLevel(true); this.settings.selectedTopLevel(null);由于某种原因,在 durandal 小部件中声明的 observables 不会进入淘汰赛堆栈或未绑定到视图(不确定是哪一个)......尚不知道为什么。为了获得淘汰的可观察对象,我必须在父视图模型级别声明小部件级别所需的任何可观察对象,并使用设置将其传递。如果你让它工作,请告诉我!
    【解决方案2】:

    转载自上面的评论,以便于阅读:

    我认为问题在于这些没有更新:

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

    由于某些原因,在 durandal 小部件中声明的 observable 不会进入淘汰赛堆栈或未绑定到视图(不确定是哪一个)...

    还不知道为什么。为了获得淘汰的可观察对象,我必须在父视图模型级别声明小部件级别所需的任何可观察对象,并使用设置将其传递。

    如果你让它工作,请告诉我!

    【讨论】:

    • 在我的 Durandal 小部件敲除 observables 中工作正常,但只有在设置下才能正常工作。
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多