【问题标题】:knockoutjs bindings issueknockoutjs 绑定问题
【发布时间】:2013-02-26 01:36:30
【问题描述】:

我的 knockoutjs 实现存在问题。似乎在 Chrome 和 Safari 上运行良好 IE 和 FF 都出现了问题。

我遇到的消息如下:

无法解析绑定。消息:TypeError:'AccountName' 是 不明确的;绑定值:值: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>

我假设模板上触发了某种早期绑定

数据:当前帐户

未定义/空值被传递到 CurrentAccount。我在脚本标签之外看到过这个问题,但前提是未定义可观察对象或为空。

我的视图模型如下所示:

    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 对象,因为在这种情况下可能不需要它。

我将不胜感激。

提前谢谢你。

【问题讨论】:

    标签: javascript internet-explorer knockout.js knockout-2.0 knockout-mvc


    【解决方案1】:

    Knockout 中没有“早期”绑定。当您致电ko.applyBindings 时,一切都已绑定。但是某些绑定可以停止或延迟其后代元素的绑定。当您使用 ififnot 选项时,template 就是其中之一。在您的情况下,您可以像这样使用if 选项:

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

    注意:在一些较旧的浏览器中,if 周围的引号是必需的。

    【讨论】:

    • 迈克尔,你的姓是 Best 是有原因的。说够了。谢谢你。 'if' 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2012-03-22
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多