KnockoutJS - 可观察对象未定义?

时间:2013-03-21 00:50:25

标签: knockout.js knockout-mapping-plugin

我还是Knockout的新手,所以我希望有人能够帮助我。

这是我的观点模型:

baseModel = {
    logged_in : ko.observable(),
    alerts : ko.observableArray(),
    errors: ko.observable()
};

在我的HTML中,我有:

<span data-bind="text: ($root.errors['myerror1'] === undefined)? 'undefined':$root.errors['myerror1']"></span>

我希望通过AJAX拉入任意对象并将其分配给我的.errors属性。例如,当我的回答如此:

Object {myerror1: "password is wrong", error2: "something else is wrong"}

当我在AJAX成功回调中执行以下操作时,我希望它在我的span中显示错误:

if( response.errors !== undefined )
     baseModel.errors = ko.mapping.fromJS(response.errors, {}, baseModel.errors);

OR,

if( response.errors !== undefined )
     baseModel.errors = response.errors;

两者都没有显示我绑定在HTML中的myerror1。我可能在这里做了很多错事。我不确定是什么问题。谢谢!

1 个答案:

答案 0 :(得分:1)

如果您尝试使用新值更新errors observable,则不应使用=进行设置,而是将其作为参数传递给新值:

baseModel.errors({myerror1: "password is wrong", error2: "something else is wrong"});

更新:我发现您的代码还有两个问题:

  1. errorsundefined开头;最好将其设置为空对象,因此在首次评估绑定时不会出现错误:

    errors: ko.observable({})
    
  2. 如果您想在errors中的表达式中使用data-bind中的值,则应“调用”它以获取其值 - 而不是直接使用它:

    <span data-bind="text: ($root.errors()['myerror1'] === undefined)?
    'undefined':$root.errors()['myerror1']"></span>
    
  3. Example