我必须在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>
答案 0 :(得分:1)
不要在HTML中为绑定变量指定viewmodel.
。当您调用ko.applyBindings
时,它会为绑定变量创建默认上下文。
如果value
绑定变量的值与任何选项值都不匹配,则(默认情况下)将设置为undefined。这可能是正在发生的事情(请参阅您的&#34;未定义为什么?&#34;评论)。尝试添加valueAllowUnset选项。我可能会解释这个错误。但是,无论如何,您都希望根据选项检查初始值。
答案 1 :(得分:0)
我想问题是在通过调用fromJS完成构建模型对象之后附加事件处理程序。 所有可观察对象都已设置其值,因此如果没有手动调用valueHasMutated,则不会调用已订阅的函数。
解决方案可以通过
这样就会调用订阅函数,因为在设置值之前附加了处理程序。