я создал свой первый компонент KO:поле компоненты Доступ к КО в ViewModel
components.js
ko.components.register('team-dropdown', {
viewModel: function (params) {
var self = this;
self.teamNames = ko.observableArray([]);
$.ajax({
url: 'http://footballcomps.cloudapp.net/Teams',
type: 'get',
contentType: 'application/json',
success: function (data) {
$.each(data['value'], function (key, value) {
self.teamNames.push(value.TeamName);
});
console.dir(self.teamNames);
},
error: function (err) {
console.log(err);
}
});
self.selectedTeam = ko.observable();
},
template: { require: 'text!components/team-dropdown.html' }
});
команды dropdown.html
<div id="teams" class="inputBlock form-group">
<select class="form-control" name="teamName" data-bind="options: teamNames, value:selectedTeam"></select>
<label id="lblHomeTeam" data-bind="text: selectedTeam"></label>
И вот мой взгляд, где я хочу использовать компонент:
<div class="row" id="divFixture">
<div class="col-md-4">
<div class="panel panel-info">
<div class="panel-heading">
<h2 class="panel-title">Add new fixture</h2>
</div>
<div class="panel-body">
<form data-bind="submit: fixture.addFixture">
<div class="form-group">
<team-dropdown />
</div>....
</form>
И мой урезанная вид модели:
define(['knockout', 'knockout.validation', 'common', 'components'], function (ko) {
return function fixtureViewModel() {
function fixture(fixtureId, fixtureDate, homeId, homeName, homeBadge, homeScore, awayId, awayName, awayBadge, awayScore) {
this.FixtureId = fixtureId;
this.FixtureDate = fixtureDate;
this.HomeId = homeId;
this.HomeName = homeName;
this.HomeBadge = homeBadge;
this.HomeScore = homeScore;
this.AwayId = awayId;
this.AwayName = awayName;
this.AwayBadge = awayBadge;
this.AwayScore = awayScore;
}
var self = this;
self.Id = ko.observable();
self.FixtureDate = ko.observable();
self.HomeId = ko.observable();
self.HomeName = ko.observable();
self.HomeBadge = ko.observable();
self.HomeScore = ko.observable();
self.AwayId = ko.observable();
self.AwayName = ko.observable();
self.AwayBadge = ko.observable();
self.AwayScore = ko.observable();
self.selectedTeam = ko.observable();
self.addFixture = function() {
//how do I reference the selected item from my component here?
};
});
Как сослаться на пункт I выбранный в моем компоненте в self.addFixture?
Но разве не идея компонентов, которые вы можете подключить к различным моделям просмотра? Что, если у меня есть, например, компонент datepicker, и я хочу использовать его во многих разных моделях просмотров? Это была идея того, чего я пытался достичь здесь. – user517406
Возможно, у меня может быть неправильная картинка высокого уровня в моей голове о том, что используется для вашего примера. Какова основная модель представления? Что добавляется и что? –
У меня нет модели «основного» вида в традиционном смысле KO, у меня будет несколько моделей просмотров, например, fixtureViewModel, teamViewModel и т. Д. Файл fixtureViewModel является тем, который был указан в третьем примере кода выше, я буду использовать его для просмотра/добавления/edit/delete, в которые будут входить имена команд, дата, оценка и т. д. Компонент группы, который я планирую использовать как в моделях, так и в командных моделях и, возможно, в других моделях просмотра позже. AddFixture добавит новое приспособление к массиву приборов, который будет записан на бэкэнд db. – user517406