Javascript 无法获取属性';订阅';指未定义的或空的引用

Javascript 无法获取属性';订阅';指未定义的或空的引用,javascript,knockout.js,Javascript,Knockout.js,在订阅HTML页面中的下拉值更改时,我遇到了一个实现knockout Js的问题。这是我的HTML <div> <span>Request Types : </span> <select data-bind="options: requestTypes, optionsText: 'Name', optionsCaption: '--Selec

在订阅HTML页面中的下拉值更改时,我遇到了一个实现knockout Js的问题。这是我的HTML

    <div>
      <span>Request Types : </span>
      <select data-bind="options: requestTypes,
                    optionsText: 'Name',
                    optionsCaption: '--Select--',
                   value: selectedRequestType">
       </select>
    </div>
只有在加载泛型名称下拉列表值后,才会填充请求类型下拉列表值。用户必须首先选择泛型名称。在页面加载时,它抛出一个错误“无法获取未定义或空引用的属性‘subscribe’”


非常感谢您提供的任何帮助,因为我是javascript MVVM框架新手。

您已将viewModel声明为wd.viewModel=function(){},这是一个构造函数,您需要在绑定或订阅之前创建它的新实例。如果您添加以下内容:

wd.viewModel=new wd.viewModel()

在这条线之前,它应该能工作

var myName=wd.viewModel.selectedGenericName.subscribe(函数(){


当您尝试初始化myName时,似乎wd.viewModel.selectedGenericName未定义。
ko.observable(“”
)的预期值是多少?是wd.viewModel.selectedGenericName在页面加载时未定义,请参见下面的HTML代码(通用名称:)页面加载标题显示在ko的通用名称下拉列表controlvalue中。observable(“”)是一个可观察的函数(即函数observable(){if(arguments.length>0){//Write//Ignore writes,如果值没有更改,如果(observable.isDifferent(_latestValue,arguments[0]){observable.valueWillMutate();)
                        wd.viewModel = function () {
                        var data = {};
                        var self = this;
                        var url = '';
                        var selectedRequestingCountry = ko.observable("");
                        self.optionsProvider = new wd.optionsProvider(self);
                        self.objGenralInfo = new wd.GI_form(data);
                        /* For Requesting Country */
                        url = wd.ConfigObject.baseUrl + wd.ConfigObject.masterServiceUrl + wd.ConfigObject.category.importingCountries;     // Fetch Requesting Countries     
                        self.importingCountries = self.optionsProvider.get("importingCountries", url, {});
                        self.selectedRequestingCountry = ko.observable("");
                        this.requestingCountryArea = ko.observable("");

                        /* For Generic Name*/
                        url = wd.ConfigObject.baseUrl + wd.ConfigObject.masterServiceUrl + wd.ConfigObject.category.genericNames;     // Fetch Generic Names     
                        self.genericNames = self.optionsProvider.get("genericNames", url, {});
                        self.selectedGenericName = ko.observable("");

                        /* Override Requesting Country Address */
                        self.IsOverride = ko.observable(false);

                        /* For Request Types */
                        self.selectedRequestType = ko.observable("");
                        self.selectedTradeName = ko.observable("");
                    };

                    // Whenever the selected Generic Name changes, populate the Request Type
                    var myName = wd.viewModel.selectedGenericName.subscribe(function () {
                        wd.viewModel.url = wd.ConfigObject.baseUrl + wd.ConfigObject.masterServiceUrl + wd.ConfigObject.category.requestTypes + "/" +
                              wd.viewModel.selectedGenericName().Name;
                        wd.viewModel.requestTypes = wd.viewModel.optionsProvider.get("requestTypes", url, '');                                        // Fetch request types based on generic name
                    }, wd.viewModel);

                    $(function () {
                        ko.applyBindings(wd.viewModel);
                    });