2014-08-27 2 views
2

Я пытаюсь понять компоненты нокаута 3.2, но я застрял.функции в компонентах нокаута (knockoutjs 3.2+)

У меня есть компонент «Клиенты»

ko.components.register("customers", { 
    viewModel: function (params) { 
    var self = this; 
    this.customers = ko.observableArray(); 
    this.selectedCustomerId = ko.observable(1); 
    this.selectCustomer = function (data) { 
     selectedCustomerId(data.Id); 
    }; 

    $.getJSON('http://localhost:49435/Customer/GetCustomers', this.customers); 
}, 
template: "<div><table class=\"table table-condensed table-responsive\"><thead><tr><th>Customer ID</th><th>Name</th><th>City</th></tr></thead><tbody data-bind=\"foreach: customers\"><tr><td data-bind=\"text: Id\"></td><td data-bind=\"text: Name, click: $root.selectCustomer\"></td><td data-bind=\"text: City\"></td></tr></tbody></table></div>" 
}); 

Но при связывании, я получаю следующее сообщение об ошибке:

Unable to process binding "click: function(){return $root.selectCustomer }" Message: Cannot read property 'selectCustomer' of undefined

Следующая вещь, которую я хочу сделать, это общение с selectedCustomerId к другому компоненту. Возможно ли это с помощью PubSub Synchronization и как это возможно. Может кто-нибудь дать мне подсказку, с чего начать.

+0

Вы называете ko.applyBindings в любом месте? Если это так, я думаю, что модель, которая передается ему как параметр, считается $ root. Попробуйте использовать $ parent вместо $ root. –

+0

Это находится в ko 3,3 milestone https://github.com/knockout/knockout/issues/1449 – huocp

ответ

3

Используйте $parent вместо $root у вас привязки. $root обычно относится к модели представления, которая передается методу ko.applyBindings.

У вас также есть другая ошибка в вашем коде - в методе selectCustomer, который вы пытаетесь получить доступ к глобальной переменной selectedCustomerId, которой не существует. Вы должны префикс его self, чтобы иметь возможность доступа к локальной переменной, которая создается в вашей модели представления.

var self = this; 
    self.customers = ko.observableArray(); 
    self.selectedCustomerId = params.SelectedCustomer; 
    self.selectCustomer = function (data) { 
     self.selectedCustomerId(data.Id); 
    }; 

Что касается прохождения selectedCustomerId к другому компоненту - вы можете создать наблюдаемый в вашей модели представления корня (который вы передаете ko.applyBindings), а затем передать его компонентам, как это:

<customers params='SelectedCustomer:selectedCustomer'></customers> 

И затем использовать это наблюдается при привязке данных. Проверьте рабочий стол fiddle.

+0

ПРИМЕЧАНИЕ. В соответствии с планом Евгения вы можете передать 'selectedCustomerId' в качестве параметра SelectedCustomer для дочерних компонентов. Этот способ делать вещи сначала казался мне странным, но если вы подумаете об этом, он стал интерфейсом компонента для внешнего мира. Я думаю, что было бы хорошей практикой изложить, какие параметры каждый компонент занимает как красиво отформатированный комментарий выше, где бы вы ни определили компонент. Кроме того, посмотрите, как Стив Сандерсон расщепляет html и js: http://blog.stevensanderson.com/2014/06/11/architecting-large-single-page-applications-with-knockout-js/ – Milimetric