0

У меня проблемы с моей реализацией 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, как это, возможно, не требуется в этом контексте.

Буду признателен за любую помощь.

Заранее спасибо.

ответ

3

В «Нокауте» нет «ранней» привязки. Все связано, когда вы звоните ko.applyBindings. Но некоторые привязки могут остановить или отложить привязку их элементов-потомков. template является одним из тех, когда вы используете опции if или ifnot. В вашем случае, вы можете использовать опцию if так:

template: { name: 'dialogFormTemplate', data: CurrentAccount, 'if': CurrentAccount } 

Примечание: Кавычки вокруг if необходимы в некоторых старых браузерах.

+0

Майкл, есть причина, почему ваша фамилия самая лучшая. Достаточно сказано. Спасибо. «если» исправил проблему. – Sash