2016-07-12 10 views
0

以下は、私がvar self = thisを定義したViewModelの内部です。私はコード内で動作する別のforeachバインディングを持っていますが、それはajaxリクエストにはありません。最初のUIロードが機能します。私はself.wikiDataがconsole.log(self.wikiData());でテストすることで更新されていることを知っていますが、UIでは更新されません。私は、Ajaxリクエストの外で同様のことをしています。ノックアウトforeach update inside ajax

​​

答えて

0

それを考え出しました。私はobservableArray内のオブジェクトを追跡し、オブジェクト自体の内部データを操作する必要がないので、observablesを削除することになりました。

$.ajax({ 
 
    url: "http://en.wikipedia.org/w/api.php?action=opensearch&search=" + marker.title + "&callback=wikiCallBack", 
 
    dataType: 'jsonp', 
 
    success: function(response) { 
 
    // TODO figure out why ko array isnt updating 
 
    // articleList is just an array is strings 
 
    var articleList = response[1]; 
 
    var tempArray = []; 
 
    if (articleList.length < 1) { 
 
     tempArray.push({ 
 
     title: "No articles found", 
 
     url: "#" 
 
     }); 
 
    } else { 
 
     for (var i = 0; i < articleList.length; i++) { 
 
     articleStr = articleList[i]; 
 
     tempArray.push({ 
 
      title: articleStr, 
 
      url: "http://en.wikipedia.org/wiki/" + articleStr 
 
     }); 
 
     } 
 
    } 
 
    tempArray.push({ 
 
     title: "Courtesy of Wikipedia API", 
 
     url: "https://www.mediawiki.org/wiki/API:Main_page" 
 
    }); 
 
    // Clear wikiData array's contents by redefining with new content 
 
    self.wikiData.removeAll(); 
 
    tempArray.forEach(function(item) { 
 
     self.wikiData.push(item); 
 
    }); 
 
    // Push wiki attribution regardless of whether articles were found 
 
    //clearTimeout(wikiRequestTimeout); 
 
    if (self.isWikiMenuVisible() === false) { 
 
     self.clickHamburgerWiki(); 
 
    } 
 
    } 
 
});

HTMLは同じとどまっ:ここでは他のすべてです。

KOにアップデートを認識させる方法は、observableArrayを空の配列に再割り当てするのではなく、observableArrayを空にして新しいオブジェクトをpushするためにremoveAll()関数を使うことでした。これは、再割り当てによって以前に設定されたバインディングが削除され、removeAll()によってそれらが残されているため意味があります。

関連する問題