1

2 つの選択リストがあります。2 番目の値は、最初の値と ajax リクエストから返されたデータに応じて設定する必要があります。

<select id="parent" data-bind="options: parentOptions, value:selectedParentOption, optionsText: 'parent_name'"></select>
<select id="children" data-bind="value:selectedChildOption, visible:hasChildOptions">
   <!-- ko if:hasChildOptions -->
       <!-- ko foreach: children -->
           <option data-bind="text: child_name, option:$data"></option>
       <!-- /ko -->
    <!-- /ko -->
</select>

以前は機能していましたが、RequireJS を使用して機能を個別のモジュールに抽象化しようとしています。

// VIEWMODEL MODULE
define(["knockout", "ajax"], function(ko, ajax) {
return function ViewModel()
{
        self = this;
        self.parentOptions = ko.observable();
        self.selectedParentOption = ko.observable();
        self.hasChildOptions = ko.computed(function(){
            if(!self.selectedParentOption()) return false;
            if(!self.selectedParentOption().has_children)) return false;
            childOptions = ajax.loadChildOptions(self.selectedParentOption().id);
            childOptions.success(function(data){
                self.childOptions(data);
            })
            return true;
        })
        self.childOptions = ko.observableArray([]);
        self.selectedChildOption = ko.observable();
}
});

//AJAX MODULE
define(['jquery', 'knockout', 'parentoption', 'childoption'], function($, ko, ParentOption, ChildOption){
    function loadParentOptions () {
        return $.getJSON('get_parent_options', function(data){
            var mappedParentOptions = $.map(data, function(item){
                 return new ParentOption(item.id, item.parent_name, item.has_children);
            })
            return mappedParentOptions;
        })
    }

    function loadChildOptions (parentId) {
        return $.getJSON('get_child_options', { parent: parentId}, function(data){
            var mappedChildOptions = $.map(data, function(item){
                return new ChildOption(item.id, item.child_name);
            })
            return mappedChildOptions;
        })
   }

   return {
        loadParentOptions: loadParentOptions,
        loadChildOptions: loadChildOptions
   }
});

//PARENT OPTION MODULE
define(["knockout"], function(ko){
    return function ParentOption(id, name, has_children){
        this.id = ko.observable(id);
        this.parent_name = ko.observable(name);
        this.has_children = ko.observable(has_children);
    }
})

//CHILD OPTION MODULE
define(["knockout"], function(ko){
    return function ChildOption(id, name){
        this.id = ko.observable(id);
        this.child_name = ko.observable(name);
    }
})

で開始されます

define(["jquery", "knockout", "viewmodel", "ajax"],function($, ko, ViewModel, ajax) {
    var vm = new ViewModel();
    ko.applyBindings(vm);
    parentOptions = ajax.loadParentOptions();
    parentOptions.success(function(data){
        vm.parentOptions(data);
    });
});

モジュールに移動する前は問題なく動作していたので、サーバーからのjsonは問題ないと確信していますが、今では次のようになります。

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: child_name is not defined;
Bindings value: text: child_name, option:$data 

最初の選択リストは問題なく表示されます。

4

0 に答える 0