KNOCKOUT JS observableArray重复

时间:2014-05-26 16:35:18

标签: javascript jquery html knockout.js

我的html页面是:

<div data-role="content">   
    <div id="menu">
        <ul id="menu" data-role="listview" class="ui-listview " 
            data-bind="foreach: menu">
            <li>
                <a data-bind="text:name, attr: {href: urlmenu}"></a>
                <a href="#"  data-bind="{ click: $parent.remove }" 
                   data-role="button" data-icon="delete"></a>
            </li>
        </ul>
     </div> 
</div>

<div data-role="footer" data-position="fixed">
    <div data-role="navbar">
        <ul id="footer">
            <li><a href="#home" data-icon="home">Home</a></li>
            <li><a href="#Asignaturas" data-icon="grid">Asignaturas</a></li>
            <li><a href="#bandejaentrada" data-icon="mail">Mensajes</a></li>
        </ul>
    </div>
</div>

我的JS代码是:

$( document ).on( "pagebeforechange" , function(e, data) {
      var toPage = data.toPage[0].id;

     if( toPage == "home"){
         ko.cleanNode(document.getElementById('menu'));
         menu();
     }
});

function menuViewModel(){
    var self = this;
    self.menu = ko.observableArray([]);
    self.menu.removeAll();
    self.menu = ko.observableArray([
                    new EditMenuViewModel("Perfil"),
                    new EditMenuViewModel("Asignaturas")
                ]);
}

function EditMenuViewModel(name) {
    this.name = ko.observable(name);
    this.urlmenu = ko.observable("#"+name);        
};    

function menu(){
    var menuviewModel = new menuViewModel();
    ko.applyBindings(menuviewModel, document.getElementById('menu'));       
}

当我第一次加载页面时,一切正常,但当我点击链接页脚回家时,数组内容会重复。

示例在这里:

First Load

after click footer home link

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

您有两个带有id=menudivul的DOM元素。

<div id="menu"> <!-- <-- change this id for example -->
    <ul id="menu" data-role="listview" class="ui-listview " 
        data-bind="foreach: menu">
    ...
    </ul>
</div>

ID应该是唯一的,您需要更改其中一个元素的ID,希望这也可以解决您的问题。

更新

正如您在this thread中所读到的那样,ko.cleanNode不会删除使用foreach绑定创建的项目。

您需要改变方法。

这是一个jsFiddle,可以重现您的问题。

你可以做的是停止清理+应用绑定,然后更新你的observableArray:

$( document ).on( "pagebeforechange" , function(e, data) {
      var toPage = data.toPage[0].id;

     if( toPage == "home"){
         menuviewModel.menu.removeAll(); //clear menu
         //add whatever menu item you need
         menuviewModel.menu.push(new EditMenuViewModel("New Menu1 " + (new Date()).getTime()));
         menuviewModel.menu.push(new EditMenuViewModel("New Menu2 " + (new Date()).getTime()));
     }
});

function menuViewModel(){
    var self = this;
    self.menu = ko.observableArray([]);
    self.menu.removeAll();
    self.menu = ko.observableArray([
                    new EditMenuViewModel("Perfil"),
                    new EditMenuViewModel("Asignaturas")
                ]);
}

function EditMenuViewModel(name) {
    this.name = ko.observable(name);
    this.urlmenu = ko.observable("#"+name);        
};    

//bind only once
var menuviewModel = new menuViewModel();
ko.applyBindings(menuviewModel, document.getElementById('menu'));

这是an example

答案 1 :(得分:0)

这是旧线程,但我找到了一种(丑陋的)克服它的方法: 在清理之前,我正在缓存可观察的数组值并仅使用1值设置它。重新绑定后,我正在恢复缓存的值。像这样:

var self = this;
self.myArray = ko.observableArray(['val1', 'val2']);
var tempArray = [];
self.BeforeCleaning = function () {
    tempArray = self.myArray()
    self.myArray(['temp value']);
};

self.AfterRebinding = function () {
    self.myArray(tempArray);
};
可怕,但对我有用。