knockout js, вызывающий свойство извне модели представления всегда null

87
10

Я пытаюсь реализовать BlueImp загрузки файлов BlueImp и передавать загруженные URL-адреса в мою модель нокаута.

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

Я добавил код ниже:

<script>
var viewModel = null;
var $form = null;

$(function () {
var jsonData = someSerilizedDataFromTheServer;
viewModel = new ViewModel(@Html.Raw(jsonData))
ko.applyBindings(viewModel);

$form = $('#fileupload').fileupload({
dataType: 'json'
}).on('fileuploaddone', function (e, data) {
// here this is called for each individual file
if (typeof data.result != 'undefined') {
debugger;

var file = data.result.files[0]
var roomId = $("#hdnRoomId").val();
viewModel.addImageUrl(roomId, file.url);
}
});
});
$('#fileupload').addClass('fileupload-processing');
</script>

koViewModel.js

var ViewModel = function(data) {
var self = this;

ko.mapping.fromJS(data, {}, self);

..other stuff

this.addRoom = function() {
self.Rooms.push(new Room());
}

this.addImageUrl = function(roomId, imageUrl) {
debugger;

var room = ko.utils.arrayFirst(self.Rooms(), function(roomId) {
return room.RoomID === roomId;
})
}
..other stuff

}

var Room = function () {
..roomProperties
}

Моя кнопка html Я добавляю комнату с

<button id="newRoom" type="button" data-bind="click: addRoom">New Room</button>

При отладке он показывает self.Rooms() не является функцией или self.Rooms undefined. Но я только что добавил комнату (номер был добавлен нажатием кнопки выше), поэтому я ожидаю увидеть значение

спросил(а) 2017-03-23T03:07:00+03:00 2 года, 8 месяцев назад
2
Решение
83

Он не жалуется, что Номера не определены. Он жалуется, что "комната" не определена. Ошибка заключается в том, что имена переменных не совпадают. Вы сказали, что каждый элемент массива Rooms передается в анонимную функцию как "roomId", а затем вы пытаетесь получить доступ к "комнате", которая не определена.

var room = ko.utils.arrayFirst(self.Rooms(), function(roomId) {
return room.RoomID === roomId;
})

"function (roomId)" должна быть "функция (комната)"

var room = ko.utils.arrayFirst(self.Rooms(), function(room) {
return room.RoomID === roomId;
})

У вас есть другая переменная "комната" за пределами функции, чтобы удерживать результат, хотя вы можете переименовать обе переменные из массива First First в другое.

ответил(а) 2017-03-23T17:05:00+03:00 2 года, 8 месяцев назад
Еще 1 ответ
32

Вы уже инициализировали массив Наблюдения Комнаты?

var ViewModel = function(data) {
var self = this;

ko.mapping.fromJS(data, {}, self);
self.Rooms = ko.observableArray(); // --> Here?

..other stuff

this.addRoom = function() {
self.Rooms.push(new Room());
}


Потому что из вашего сообщения об ошибке "self.Rooms() не является функцией или self.Rooms undefined". мне кажется, что он не был инициализирован.

ответил(а) 2017-03-23T09:24:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема