Knockout.js:未观察到ViewModel属性

时间:2016-12-09 11:04:31

标签: knockout.js mapping angular2-observables

我认为我错过了某个基本概念。 下面代码的输出是100%,但是对象上的属性没有被观察到"。

<script>
    var model = { };

    var mapping = {            
            create: function () {
                var _profile;
                $.ajax({
                    type: "GET",
                    url: 'Manage.aspx/GetContact',
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: false,
                    success: function (results) {
                        _profile = results.d;
                    },
                    error: function (err) {
                        alert(err.status + " - " + err.statusText);
                    }
                });
                return _profile;
            }
    };      

    $(document).ready(function () {                        
        var vm = ko.mapping.fromJS(model, mapping);
        ko.applyBindings(vm);
    });
</script>

<dl class="dl-horizontal">
    <dt>
    <label>E-Mail:</label></dt>
        <dd><span data-bind="text: E_Mail" /></dd>
        <dd><asp:TextBox runat="server" data-bind="value: E_Mail" /></dd>
</dl>

我的代码背后:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static DynamicsNAV.NavContact.Contact GetContact()
{
    DynamicsNAV.NavContact.Contact contact = ReadContact();
    if(contact == null)
    {
        contact = new DynamicsNAV.NavContact.Contact();
        contact.E_Mail = HttpContext.Current.User.Identity.Name;
    }

    return contact;
}

在此示例中,我尝试在更改文本框中的电子邮件地址时查看UI是否已更新,但事实并非如此。 如果我添加电子邮件:ko.observable();属性到模型,并在文本框和标签中使用它,更新按预期工作。

如果我这样做:

var model = ko.observable();

加载页面时不显示任何值。并且没有错误。

亲切的问候, EV

1 个答案:

答案 0 :(得分:0)

感谢您的回复,它确实将我的思维过程发送到解决问题的路径上!

我的问题似乎是在映射和处理顺序中。 一般来说,我误解了映射中'create'的功能。 我认为它可以帮助检索和填充模型。

所以这最终成了我的解决方案:

  • 填充数据
  • 将其映射到视图模型

          
    var model = { };
    
    var vm;
    $(document).ready(function () {
    
        $.ajax({
            type: "GET",
            url: 'Manage.aspx/GetContact',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false,
            success: function (results) {
                model = results.d;
            },
            error: function (err) {
                alert(err.status + " - " + err.statusText);
            }
        });
    
        vm = ko.mapping.fromJS(model);
        ko.applyBindings(vm);
    });