2017-03-23 14 views
0

BlueImpファイルアップロード機能を実装し、アップロードされたURLをノックアウトビューモデルに渡そうとしています。ノックアウトjsビューモデル外のプロパティを常に呼び出す

私の問題は、プロパティから必要な項目を選択しようとすると、そのプロパティは常にnullです、なぜですか?

私は以下の私のコード追加しました:それをデバッグするself.Roomsを示したとき、私は

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

で部屋を追加

<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]ボタンを()関数またはself.Rooms未定義ではありません。しかし、部屋を追加しました(上記のボタンをクリックして部屋を追加しました)ので、値が表示されることを期待しています。

+0

「Rooms」にはどこの値を割り当てていますか? –

+0

エラーが発生しているaddRoomはありますか?それは私がルームが使用されているのを見る唯一の場所です。あなたのビューモデルjsonはどのように見えますか? –

+0

newRoomボタンをクリックすると、addRoomが呼び出されます。新しい部屋がUIに表示され、画像をアップロードできます。画像のアップロードが完了すると、 'fileuploaddone'が呼び出されます。ご覧のとおり、addImageUrlを呼び出すと、ko.utils.arrayFirstにエラーが発生します。そのため、newRoomボタンがクリックされた時点で部屋が初期化されています – tony09uk

答えて

0

ルームオブザーバブルアレイを初期化しましたか?

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()は関数でも、自己でもないため、定義されていません。"それは初期化されていないと私には思われます。

0

ルームが未定義であると不平を言うことはありません。 「部屋」は定義されていないと不平を言います。エラーは、変数名が一致しないことです。ルーム配列の各アイテムが "roomId"として無名関数に渡され、次に定義されていない "room"にアクセスしようとしたとします。

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

"機能(roomId)" "機能(部屋)" である必要があります

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

あなたはかかわらず、結果を保持する機能の他、 "部屋" 変数の外を持っているのでarrayFirstルーム変数の両方の名前を別のものに変更したいかもしれません。

関連する問題