2013-07-02 1 views
0

У меня есть мнение, как это:KNOCKOUT асинхронные наблюдаемые паттерны превращается в петлю бесконечности

<xsl:comment>ko with: resolve(1)</xsl:comment> 
<xsl:comment>ko template: { name: typeName }</xsl:comment> 
<xsl:comment>/ko</xsl:comment> 
<xsl:comment>/ko</xsl:comment> 

и ViewModel (DataContext вида) с методом, как это:

self.resolve = function (id) { 
    var obs = ko.observable(null); 
    self.getItemByIdAsync(id).done(obs); 
    return obs; 
}; 

По какой-то причине это превращается в бесконечную петлю. Я предполагаю, что связанное с привязкой думает, что это зависит от значения наблюдаемого obs, и когда он обновляется, привязка пытается снова запустить решение, и снова и снова ...

Как я могу изменить это кода, чтобы разрешение запускалось только один раз?


То, что я пытаюсь сделать, - это иметь динамическую модель обзора, которая адаптируется к тому, что представление хочет представить. Если представление пытается разрешить элемент в определенном контексте viewmodel, он должен загрузить этот элемент async, создать для него новую модель представления и добавить его в качестве модели child-view в datacontext-vm.

Я видел этот асинхронный наблюдаемый рисунок, когда в другом месте, но я, кажется, неправильно его использую.

ответ

0

Ваше наблюдение верно, self.resolve вызывается всякий раз, когда вы пытаетесь установить obs, следующее из knockout doc:

Если выражение вы поставляете включает любые наблюдаемые значения, выражение будет пересмотрена когда изменяется какое-либо из этих наблюдаемых.

Я не знаю, почему вы используете self.resolve функцию с with, мой подход к этой проблеме, вероятно, выглядеть следующим образом:

function ViewMode() { 
    ... 
    self.obs = ko.observable(null); 

    self.resolve = function (id) { 
     self.getItemByIdAsync(id).done(self.obs); 
    }; 

    self.resolve(1); // kick start the UI with id = 1 
} 

Тогда в представлении, просто используйте data-bind="with: obs".

+0

Я пытался динамически с точки зрения получить любой асинхронный объект по id без необходимости иметь наблюдаемые объявления для каждого элемента. Но maybee (возможно) я должен немного пересмотреть свой дизайн. –

Смежные вопросы