Моя модель данных состоит из двух объектов; проекта и задачи. загружаю мои данные из БД с помощью JSON и MVC-сервисов и карта мои observableArrays как это:Как получить доступ к нокаут-наблюдаемым из разных областей объектов
viewModel = function() {
var self = this;
// some code...
// projects
self.Projects = ko.observableArray();
var mappedProjects = [];
$.ajax({
url: "myService/GetProjectsByUserId",
data: "userID=" + meID,
dataType: 'json',
async: false,
success: function (allData) {
mappedProjects = $.map(allData, function (item) {
return new Project(item);
});
}
});
self.Projects(mappedProjects);
// tasks
self.Tasks = ko.observableArray();
var mappedTasks = [];
$.ajax({
url: "myService/GetTasksByUserID",
data: "userid=" + meID,
dataType: 'json',
async: false,
success: function (allData) {
mappedTasks = $.map(allData, function (item) {
return new Task(item, self.Projects); // is there a smarter way to access self.Projects from the Scene prototype?
//return new Task(item);
});
}
});
self.Tasks(mappedTasks);
//some more code...
};
где
Project = function (data) {
this.projectID = data.projectID;
this.type = ko.observable(data.type);
};
Task = function (data, projects) {
this.taskID = data.taskID;
this.projectID = data.projectID;
//this.projecttype = ??? simpler solution?
this.projecttype = ko.computed(function() { // Is there a simpler way to access 'viewModel.Projects' from within 'Task'?
var project = ko.utils.arrayFirst(projects, function (p) {
return p.projectID === self.projectID;
});
if (!project) {
return null;
}
else {
return project.headerType();
}
});
};
Дело в том (как вы видите) Я хочу, чтобы получить доступ к projectType внутри объекта Task. Есть ли более простой способ сделать это, чем создать экземпляр объекта с помощью self.Projects как вход?
Может ли self.Projects быть связанным, если он определен каким-то образом, чтобы я мог получить к нему доступ через DOM?
Да! вы можете, если у вас есть все ваши функции, объявленные в функции 'viewModel', тогда' self.Projects' становится глобально доступным для внутренних функций i.e 'Task'. –
несколько большая проблема, я вижу, что вы инициализируете self.projects сразу после вызова ajax; так как это async, self.Projects никогда не будет задан с фактическими сопоставленными данными, а пустой массив – dfperry
Как мне получить доступ к viewModel из Task = function (data) {}? ViewModel не связан, когда я обращаюсь к данным, это не вызовет проблем? –