我没有看到敲门价值进入我的绑定文本字段

时间:2014-06-18 12:21:10

标签: javascript design-patterns knockout.js

我有以下代码,虽然我没有看到第一个名字在表单文本框中的值?我可以在firebug中看到价值是正确的吗? 任何帮助非常感谢!

Firebug - 控制台窗口

pageModel.firstname()  // shows value: 'Jane'

HTML

<input id="Firstname" name="Firstname" data-bind="value: pageModel.firstname'" />

JS

$(function() {

    pageModel = (function() {          
        var init = function(data) {
            this.firstname = ko.observable(data.Member.FirstName);
            ...
            ...
        };
        return { init: init };  // Revealing module pattern
    })();

    ko.applyBindings(pageModel);

    var serverModel = <%=ViewData.Model.ToJson() %>;

    pageModel.init(serverModel);
});

JSON对象

 {"Member":{FirstName: 'Jane'}}

4 个答案:

答案 0 :(得分:1)

您的视图模型为pageModel,因此您的绑定仅引用视图模型上的对象。将绑定更改为:

data-bind='value: firstName'

你应该全力以赴。

答案 1 :(得分:1)

那里有几个问题:

  1. 在初始化视图模型之前,您正在应用绑定。如果您打开自己的网络控制台,则会看到KO发来的错误,说它不知道pageModel是什么。

  2. 即使您初始化模型,它仍然没有pageModel属性。只是一个firstname财产。

  3. 在绑定结束时您还有一个'

  4. 另外,您的代码会成为The Horror of Implicit Globals的牺牲品,因为您并未在任何地方声明pageModel

    一些修正:

    $(function() {
    
        // Added `var` here
        var pageModel = (function() {          
            var init = function(data) {
                this.firstname = ko.observable(data.Member.FirstName);
                ...
                ...
            };
            return { init: init };  // Revealing module pattern
        })();
    
    
        var serverModel = <%=ViewData.Model.ToJson() %>;
    
        pageModel.init(serverModel);
    
        // Moved this to end
        ko.applyBindings(pageModel);
    });
    

    并在HTML中:

    <input id="Firstname" name="Firstname" data-bind="value: firstname" />
    <!-- No `pageModel.` here -------------------------------^        ^
         No single quote here ---------------------------------------/
    -->
    

    Live Examplesource

    如果你真的想在调用pageModel.init之前应用绑定,你需要做一些事情来创建firstname observable,然后在{ {1}}使用init参数更新observable(而不是创建新参数)。

答案 2 :(得分:0)

主要问题是你应该只使用data-bind =&#34; value:firstname&#34;没有&#39;和pageModel。

如果您创建一个可以创建对象的ViewModel,它会更容易阅读。

HTML:

<input id="Firstname" name="Firstname" data-bind="value: firstname" />

js:

$(function() {
    var serverModel = <%=ViewData.Model.ToJson() %>;
    var viewModel = new ViewModel(serverModel);
    ko.applyBindings(viewModel);
});

var ViewModel = function(serverModel) {
    var self = this;

    self.firstname = ko.observable(serverModel.Member.FirstName);
};

答案 3 :(得分:0)

您可以检查数据绑定的上下文。它已经是pageModel了。你不需要重复上下文来淘汰赛。与data-bind="with: pageModel"一样好,并且此元素内的绑定不需要重复pageModel