1

我从 knockoutjs 收到以下错误。它大部分时间都清楚地知道 AreaNames 是什么,因为 UI 显示 AreaNames 正在显示,但在某些时候,javascript 会因错误而冻结。

Uncaught Error: Unable to parse bindings. 
Message: TypeError: Object #<Object> has no method 'AreaNames'; 
Bindings value: foreach: ActiveDay().AreaNames()

相关代码:

<ul data-bind="foreach: ActiveDay().AreaNames()">
    <li data-bind="text: $data"></li>
</ul>

var scheduleModel = function (shiftCellToggle) {
    var vm = this;
    vm.ActiveDay = ko.observable({ AvailableShiftCategories: [] });
    vm.CustomMapping = {
        'Weeks': {
            create: function (options) {
                var week = new scheduleWeekModel(vm, shiftCellToggle);
                ko.mapping.fromJS(options.data, week.CustomMapping, week);
                return week;
            }
        }
    };
}

    var scheduleWeekModel = function (scheduleModel, shiftCellToggle) {
        var vm = this;
        vm.CustomMapping = {
            'Days': {
                create: function (options) {
                    var day = new scheduleDayModel(scheduleModel, shiftCellToggle);
                    ko.mapping.fromJS(options.data, day.CustomMapping, day);
                    return day;
                }
            }
        };
    var scheduleDayModel = function (scheduleModel, shiftCellToggle) {
        var vm = this;
        vm.CustomMapping = {
            'AvailableShiftCategories': {
                create: function (options) {
                    var availableShiftCategory = new availableShiftCategoryModel(scheduleModel, vm, shiftCellToggle);
                    ko.mapping.fromJS(options.data, availableShiftCategory.CustomMapping, availableShiftCategory);
                    return availableShiftCategory;
                }
            }
        };

        vm.AreaNames = ko.observableArray([]);

var viewModel = new scheduleModel(createShiftToggle());
ko.applyBindings(viewModel);
4

2 回答 2

1

我发现这个一般问题的最佳解决方案是在 GC 上:https ://groups.google.com/d/msg/knockoutjs/oTVkPnNxF84/mK1FIrAaOqoJ

将 ko 对象输出为 HTML 中的 JSON 字符串。这是了解正在发生的事情的粗略但有效的工具。就我而言,我发现在启用特定 dom 元素后,后期绑定是消除我遇到此类错误的特定问题的关键。请尝试 GC group 上描述的解决方案。

于 2012-09-28T06:31:57.337 回答
0

您的代码显示AreaNames位于名为 vm 的对象上。但是您的绑定意味着它AreaNames是 object 的一部分ActiveDay。从您提供的代码来看,这没有意义。我们可能需要查看更多代码。

什么是 vm,它是如何绑定的?这是传递给的对象applyBindings吗?

我的第一个想法是,假设ActiveDay是您的根虚拟机上的一个属性,它在某些时候未被分配,这会以您描述的方式破坏绑定。

希望这可以帮助。

于 2012-04-17T21:51:40.380 回答