У меня проблемы с моей реализацией knockoutjs. Кажется, он отлично работает в Chrome и Safari. IE и FF выбрасывают шипение.knockoutjs bindings issue
сообщение, которое я встречаю выглядит следующим образом:
Unable to parse bindings. Message: TypeError: 'AccountName' is undefined; Bindings value: value: AccountName
Проблема происходит внутри тега сценария, который служит в качестве шаблона выбывание:
<div id="newAccountDialog" class="dialog" data-bind="dialog: { autoOpen: false, resizable: false, modal: true, width: 350, title: 'Exchange Account'}, template: { name: 'dialogFormTemplate', data: CurrentAccount }, openDialog: IsNew"></div>
<script id="dialogFormTemplate" type="text/html">
<form id="dialogForm">
<h1>Exchange Account Manager</h1>
<p>Add new or edit an existing exchange account settings.</p>
<label for="AccountName">
Account
</label>
<input id="AccountName" name="AccountName" type="text" data-bind="value: AccountName, valueUpdate: 'afterkeydown'" class="ui-widget-content ui-corner-all" />
<div class="buttonsContainer floatRight">
<button id="Save" data-bind="click: $root.SaveAccount, dialogcmd: { id: 'newAccountDialog', cmd: 'close'}, jqButton: { icons: { primary: 'ui-icon-disk' } }">Save & Close</button>
</div>
</form>
</script>
Я предполагаю, что какое-то раннее связывание инициируется по шаблону
data : CurrentAccount
, где передается неопределенное/null int o CurrentAccount. Я видел эту проблему за пределами тегов скрипта, но только в том случае, если наблюдаемый не определен или null.
Мой ViewModel выглядит следующим образом:
var AccountModel = function() {
var self = this;
self.Accounts = ko.observableArray([]);
self.CurrentAccount = ko.observable(null);
self.IsNew = ko.observable(false);
self.LoadAccounts = function() {
$account.invoke("GetAccounts", {}, function (data) {
var mapped = $.map(data, function (item) {
var account = new Account(item);
var innerMapped = $.map(item.Mailboxes, function (mailbox) {
return new Mailbox(mailbox);
});
account.Mailboxes(innerMapped);
return account;
});
self.Accounts(mapped);
});
}
self.EditAccount = function (data) {
self.CurrentAccount(data);
self.IsNew(true);
}
self.SaveAccount = function() {
if (self.CurrentAccount().Id() <= 0) {
$account.invoke('AddAccount', ko.toJS(self.CurrentAccount()), function (data) {
self.Accounts.push(new Account(data));
self.CurrentAccount(new Account(data));
self.IsNew(true);
});
} else {
$account.invoke('UpdateAccount', ko.toJS(self.CurrentAccount()), function (data) {
//self.CurrentAccount(new Account(data));
});
}
}
self.CreateAccount = function() {
self.IsNew(true);
var account = { Id: 0, AccountName: '', IsNTLM: -1, Email: '', Password: '', Domain: 'mydomain', ExchangeVersion: 1, Mailboxes: [] };
self.CurrentAccount(new Account(account));
}
};
Мой диалог bindingHandler определяется следующим образом:
ko.bindingHandlers.dialog = {
init: function (element, valueAccessor) {
var options = ko.utils.unwrapObservable(valueAccessor()) || {};
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).dialog('destroy');
});
$(element).dialog(options);
}
};
Я не определять объект Account, как это, возможно, не требуется в этом контексте.
Буду признателен за любую помощь.
Заранее спасибо.
Майкл, есть причина, почему ваша фамилия самая лучшая. Достаточно сказано. Спасибо. «если» исправил проблему. – Sash