从视图模型外部调用属性的knockout js始终为null

时间:2017-03-23 00:07:34

标签: knockout.js

我正在尝试实施BlueImp文件上传功能,并将上传的网址传递给我的knockout viewmodel。

我的问题是,当我尝试从属性中选择所需的项时,该属性始终为null,为什么?

我在下面添加了我的代码:

<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。但我刚刚添加了一个房间(通过点击上面的按钮添加了房间)所以我希望看到一个值

2 个答案:

答案 0 :(得分:0)

你之前是否初步确定了Rooms observable数组?

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。”在我看来,它尚未初始化。

答案 1 :(得分:0)

不抱怨客房未定义。它抱怨说&#34;房间&#34;未定义。错误是您的变量名称不匹配。您已经告诉它,Rooms数组中的每个项目都会被传递到匿名函数中,因为&#34; roomId&#34;,然后您尝试访问&#34; room&#34;这是未定义的。

for (int i=0;i<10;i++){
    std::cout<<arr1[i%10]<<std::endl;
    //other processing using arr1[i] indexing
}

&#34;函数(的 roomId )&#34;应该是&#34;功能(房间)&#34;

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

你有另一个&#34;房间&#34;函数外部的变量来保存结果,因此您可能希望将两个arrayFirst房间变量重命名为其他变量。