2012-02-09 3 views
0

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

Here is the fiddle.

HTML

<select data-bind="options: widgets, optionsText: 'name', value: current_widget, optionsCaption: 'Choose...'"></select> 
<input data-bind="value: current_widget() ? current_widget().name : 'nothing'" /> 

Javascript

var cdta = {}; 
$(document).ready(function(){ 

    cdta.widgets_data = [{ "name": "foo", "id": "1"},{ "name": "bar", "id": "2"},{ "name": "bash", "id": "3"},{ "name": "baq","id": "4"}]; 

    cdta.local = {}; 
    cdta.local.current_widget = { "name": "foo", "id": "1"}; 

    alert('current_widget starting value should be: ' + cdta.local.current_widget.name); 

    function app() { 
     var self = this; 

     //widgets 
     self.widgets = ko.observableArray(cdta.widgets_data); 

     // which widget to display from a local source 
     alert('about to asign a current_widget named:' + cdta.local.current_widget.name); 
     self.current_widget = ko.observable(cdta.local.current_widget); 
    } 
    ko.applyBindings(new app()); 

    alert('after applying bindings name of current widget: ' + current_widget().name); 
    //expecting foo 
    //but doesn’t alert because current_widget isnt defined 
}); 
+0

@AlfeG спасибо, что разрешенной переменный вопрос –

+0

@Roman Батаев благодарит также части 2 о optionsCaption - это реальная Гоча –

ответ

2

В коде есть пара проблем.

  1. current_widget является свойством приложения, так что вам нужно сделать что-то вроде этого

    var app = new app(); 
    ko.applyBindings(app); 
    alert('after applying bindings name of current widget: ' + app.current_widget().name); 
    
  2. Поскольку вы используете значение и optionsCaption bidnings, Нокаут установят наблюдаемый, который привязан к значению к неопределенному по умолчанию. Если вы удалите опции привязки привязки, она будет работать. Если вам нужно optionsCaption и вам необходимо выбрать начальное значение, вы должны сбросить его после применения привязок:

    var app = new app(); 
    ko.applyBindings(app); 
    app.current_widget(cdta.widgets_data[0]); //you have to select an object from the array, not a completely unrelated object cdta.local.current_widget 
    alert('after applying bindings name of current widget: ' + app.current_widget().name); 
    

UPDATE: Я был неправ на # 2. После применения привязок вам не нужно сбросить значение. Реальная проблема заключается в том, что вы используете полностью несвязанный объект (не из массива) для начального значения. Это позволит решить проблему:

cdta.local.current_widget = cdta.widgets_data[0]; 
1

Но переменная/метод current_widget действительно не определено. KnockoutJS не генерирует полные переменные.

Если вы хотите получить доступ к данным viewModel вне viewModel, вам необходимо его где-то сохранить (переменная, окно и т. Д.).

var cdta = {}; 
$(document).ready(function(){  
    //...  
    function app() { 
     //... 
    } 
    window.app = new app(); 
    ko.applyBindings(window.app); 

    alert('after applying bindings name of current widget: ' 
     + window.app.current_widget().name); 
    //expecting foo 
});