在下载更改时加载Knockout fire订阅

时间:2015-07-17 10:42:34

标签: javascript .net knockout.js

我必须在ko中使用valueHasMutated方法在页面加载时触发订阅,同时绑定国家/地区列表下拉列表以便我可以根据所选下拉列表获取状态,是否有替代方法?如何在不使用此方法的情况下触发国家/地区订阅?

Country List: <select id="CountryDropdownList" data-bind="options: viewModel.CountryCollection,optionsText:'CountryName',optionsValue:'CountryName',value:viewModel.SelectedCountry"></select>
State List: <select id="StateDropdownList" data-bind="options: viewModel.StateCollection,optionsText:'StateName',optionsValue:'StateName',value:viewModel.SelectedState"></select>

<script>
        var viewModel = ko.mapping.fromJS(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)));
        console.log(viewModel.SelectedState()); //State3 the initial value

        viewModel.SelectedCountry.subscribe(function (newSelectedCountry) {
            alert(newSelectedCountry);
            console.log(viewModel.SelectedState()); //undefined why?
            $.ajax({
                url: 'Home/GetStateList?Country=' + newSelectedCountry,
                success: function (data) {
                    viewModel.StateCollection(ko.mapping.fromJS(data)());
                    console.log(viewModel.SelectedState());  //state0 why?

                }
            })
        });


        ko.applyBindings(viewModel);
        $(function () {
           //to fire subscription
            viewModel.SelectedCountry.valueHasMutated();
        })

    </script>

2 个答案:

答案 0 :(得分:1)

不要在HTML中为绑定变量指定viewmodel.。当您调用ko.applyBindings时,它会为绑定变量创建默认上下文。

如果value绑定变量的值与任何选项值都不匹配,则(默认情况下)将设置为undefined。这可能是正在发生的事情(请参阅您的&#34;未定义为什么?&#34;评论)。尝试添加valueAllowUnset选项。我可能会解释这个错误。但是,无论如何,您都希望根据选项检查初始值。

答案 1 :(得分:0)

我想问题是在通过调用fromJS完成构建模型对象之后附加事件处理程序。 所有可观察对象都已设置其值,因此如果没有手动调用valueHasMutated,则不会调用已订阅的函数。

解决方案可以通过

  • 首先创建模型,包括订阅SelectedCountry observable。
  • 实例化此模型并设置可观察值

这样就会调用订阅函数,因为在设置值之前附加了处理程序。