【问题标题】:Unable to parse bindings js error using ko.mapping.fromJSON with parse exist view modelUnable to parse bindings js error using ko.mapping.fromJSON with parse exists view model
【发布时间】:2012-10-30 15:25:08
【问题描述】:

我想以 JSON 格式将视图模型保存在隐藏字段中。一切正常。

但是当我尝试获取它时 - 我得到了错误:

未捕获的错误:无法解析绑定。 消息:ReferenceError:selectAll 未定义; 绑定值:选中:AllCheck,单击:selectAll

JsFiddler

视图模型

function AppViewModel() {

//Week
this.AllCheck = ko.observable(false);
this.DaysOfWeekResult = ko.observableArray();

this.selectAll = function () {
    if (this.AllCheck()) {
        viewModel.DaysOfWeekResult.removeAll();

        viewModel.DaysOfWeekResult.push("Mo");
        viewModel.DaysOfWeekResult.push("Tu");
        viewModel.DaysOfWeekResult.push("We");
        viewModel.DaysOfWeekResult.push("Th");
        viewModel.DaysOfWeekResult.push("Fr");
        viewModel.DaysOfWeekResult.push("Sa");
        viewModel.DaysOfWeekResult.push("Su");
    }

    return true;
};

    this.dayClicked = function () {
    checkDays();
    return true;
};        

}

初始化代码

var viewModel;    
$().ready(function (){
        viewModel = new AppViewModel();
var viewModelDeserialized = ko.mapping.fromJSON(serializedJsonString, viewModel);

        ko.applyBindings(viewModel);
}); 


function checkDays() {
    viewModel.AllCheck(viewModel.DaysOfWeekResult().length == 7);   
}  

序列化模型

var serializedJsonString = '"AllCheck":false,"DaysOfWeekResult":[]}';

标记

<div class="check-block">
                <input name="AllWeek" id="AllWeek" type="checkbox" value="AllWeek" data-bind="checked: AllCheck, click: selectAll" />
                <label for="AllWeek">All Week</label>
            </div>
            <div class="holder">
                <span>
                    <input name="Monday" id="Monday" type="checkbox" value="Mo" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Monday">Mo</label>
                </span><span>
                    <input name="Tuesday" id="Tuesday" type="checkbox" value="Tu" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Tuesday">Tu</label>
                </span><span>
                    <input name="Wednesday" id="Wednesday" type="checkbox" value="We" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Wednesday">We</label>
                </span>               
                <span>
                    <input name="Thursday" id="Thursday" type="checkbox" value="Th" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Thursday">Th</label>
                </span><span>
                    <input name="Friday" id="Friday" type="checkbox" value="Fr" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Friday">Fr</label>
                </span><span>
                    <input name="Saturday" id="Saturday" type="checkbox" value="Sa" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Saturday">Sa</label>
                </span><span>
                    <input name="Sunday" id="Sunday" type="checkbox" value="Su" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" />
                    <label for="Sunday">Su</label>
                </span>
            </div>

【问题讨论】:

    标签: javascript json knockout.js


    【解决方案1】:

    您使用错误的参数调用ko.mapping.fromJSON

    在您的情况下正确用法如下:

    var viewModelDeserialized = 
        ko.mapping.fromJSON(serializedJsonString, {} /* empty options */, viewModel);
    

    Demo fiddle.(没有绑定错误)

    ko.mapping.fromJSON 方法的使用有点棘手:

    • 您可以使用一个参数调用它:只提供数据,例如var viewModel = ko.mapping.fromJSON(data),在这种情况下,它将返回创建的视图模型

    • 你可以用两个参数调用

      • 如果第二个参数是一个 ko 映射创建的视图模型,那么它被视为映射目标ko.mapping.fromJSON(data, koMappingCreatedViewModel)
      • 否则第二个参数将被视为映射选项(在您的情况下会发生这种情况)var viewModel = ko.mapping.fromJSON(data, options)
    • 您可以使用三个参数显式指定数据、映射和目标来调用它:ko.mapping.fromJSON(data, options, target)

    【讨论】:

    • 感谢您精彩的解释。
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    相关资源
    最近更新 更多