爬坑記錄

在使用knockout的同時(shí)也遇到了一系列的問題,在此一下總結(jié),并且日后會(huì)持續(xù)的更新與跟蹤。

view model 綁定問題

  1. view model只能在一個(gè)dom節(jié)點(diǎn)上綁定,換句話說,如果一個(gè)dom節(jié)點(diǎn)上綁定了viewmodel那么其內(nèi)部子節(jié)點(diǎn)就不能再綁定任何的viewmodel
  2. 可以使用ko.cleanNode($("#test").get(0));方法來解除綁定
  3. 如果一個(gè)dom節(jié)點(diǎn)上綁定了viewmodel,當(dāng)刪除這個(gè)dom節(jié)點(diǎn)時(shí),相應(yīng)的綁定viewmodel綁定也會(huì)消失。但是原有的viewmodel引用還會(huì)繼續(xù)緩存在頁面中,如果要繼續(xù)使用這個(gè)引用,必須要重新對(duì)viewmodel實(shí)例化。

組件(自定義標(biāo)簽)綁定問題

  1. 組件中使用subscribe出現(xiàn)了重復(fù)綁定現(xiàn)象。主要的原因在于重新使用viewmodel進(jìn)行綁定時(shí)沒有對(duì)viewmodel進(jìn)行初始化,同viewmodel綁定問題的3類似??慈缦吕?/li>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo1</title>
<script type="text/javascript" src="js/jquery1.11.1.min.js"></script>
<script type="text/javascript" src="js/knockout-3.4.1.js"></script>
</head>
<body>

<button type="button" name="button" onclick="removeInit()">remove and init</button>
<button type="button" name="button" onclick="removeRander()">remove and rander</button>

<div id="app"></div>


<script type="text/javascript">
ko.ob = ko.observable;
ko.oba = ko.observableArray;

function removeRander(){
    var template = '\
        <div id="test">\
            <div data-bind="component: {\
                name: \'list-container\',\
                params: {listArray:userList}\
            }"></div>\
            <div data-bind="component: {\
                name: \'list-container\',\
                params: {listArray:userList}\
            }"></div>\
            <button type="button" name="button" data-bind="click:clickEvent">click me</button>\
        </div>';
        $("#app").empty();
        $("#app").html(template);
}

function removeInit(){
    var template = '\
        <div id="test">\
            <div data-bind="component: {\
                name: \'list-container\',\
                params: {listArray:userList}\
            }"></div>\
            <div data-bind="component: {\
                name: \'list-container\',\
                params: {listArray:userList}\
            }"></div>\
            <button type="button" name="button" data-bind="click:clickEvent">click me</button>\
        </div>';

    if($("#test").length > 0){
        ko.cleanNode($("#test").get(0));
    }

    $("#app").empty();
    $("#app").html(template);

    // vm = new ViewModel();  此處##### 如果這個(gè)地方不重新對(duì)viewmodel進(jìn)行實(shí)例化,就會(huì)出現(xiàn)組件內(nèi)部屬性監(jiān)控實(shí)現(xiàn)綁定多次的現(xiàn)象
    setTimeout(function(){
        ko.applyBindings(vm,$("#test").get(0));
    },1000);

}



ko.components.register('list-container',{
    viewModel: function(params) {
        var _this = this;
        var listArray = _this.listArray = params.listArray;
        _this.delClickEvent = function(data){
            // console.log(data)
            listArray.remove(data);
        }
        listArray.subscribe(function(newArray) {
            console.log(newArray);
        });
    },
    template:
        '\
        <div>parentName:<span data-bind="text:name"></span></div>\
        <ul>\
            <!-- ko foreach:listArray -->\
            <li data-bind="attr:{itemId:id}">\
                <span data-bind="text:name"></span>\
                <a data-bind="click:$parent.delClickEvent" href="###">x</a>\
            </li>\
            <!-- /ko -->\
        </ul>'
});



var ViewModel = function(){

    this.userList = ko.oba([{
        id:1
        ,name:ko.ob("wenquan")
    },{
        id:2
        ,name:ko.ob("wangxueshi")
    }]);

    this.clickEvent = function(){
        this.userList.push({id:3,name:'jack'});
    }
};

var vm = new ViewModel();


</script>
</body>
</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容