ko.observable不在Durandal / KO / breeze中更新

时间:2013-04-02 03:06:22

标签: knockout.js breeze durandal

我是Durandal / breeze / knockout的新手,我正试图在项目中使用它们,但我很早就陷入了困境。

目前,我有一个单一视图(#/ household / new)来创建一个新家庭。我从api中获取了breeze元数据,然后运行EntityManager.createEntity('Household'),这会返回一个我想要的家用对象。

然后我设置StreetAddress属性的值并更新ko.observable(vm.household(hse))。一旦视图显示observable不起作用。我目前的视图模型非常简单,文本输入和div。它们都具有与StreetAddress属性的数据绑定,但它们都不会更新,也不会以我设置的默认值开始。

奇怪的是,我没有遇到任何错误,以帮助我更接近解决方案。我真的不知道我哪里出错了。任何帮助都会很棒。下面是我尝试使用的代码。

新家庭视图

<div>
    <h3>New Household Details</h3>
    <div data-bind="text: household.StreetAddress"></div>
    <input type="text" data-bind="value: household.StreetAddress" />
</div>

新家庭视图模型:

define(function (require) {
    var router = require('durandal/plugins/router');
    var mainDataservice = require('dataservices/mainDataservice');
    var system = require('durandal/system');

    var vm = {
        router: router,
        activate: activate,
        household: ko.observable()
    };    
    return vm;

    function activate() {
        return system.defer(function (dfd) {
            var hse = mainDataservice.createHousehold();
            hse.StreetAddress("1234 Main Street");
            vm.household(hse);            
            dfd.resolve();
        }).promise();
    }
});

MainDataservice

define(function (require) {

    var serviceName = 'api/mainDataservice', // route to the Web Api controller
        manager = new breeze.EntityManager(serviceName);

    return {
        manager: manager,
        activate: function () {
            //I call this manually at the start of the application
            return manager.fetchMetadata();
        },

        createHousehold: function () {
            return manager.createEntity('Household');
        }
    };
});

家庭实体框架模型

public partial class Household
{    
    [Key]
    [Required]
    [Display(Name = "Household ID")]
    public int HouseholdID { get; set; }

    [StringLength(50)]
    [Display(Name = "Street Address")]
    public string StreetAddress { get; set; }

    [StringLength(50)]
    [Display(Name = "City")]
    public string City { get; set; }

    [StringLength(2)]
    [Display(Name = "State")]
    public string State { get; set; }

    [StringLength(10)]
    [Display(Name = "Zipcode")]
    public string Zipcode { get; set; }
}

1 个答案:

答案 0 :(得分:2)

因为household是一个可观察的(它是一个函数),所以当你想在表达式中获取它的值时,你需要像函数一样使用它(即你需要输出()) :

<div>
    <h3>New Household Details</h3>
    <div data-bind="text: household().StreetAddress"></div>
    <input type="text" data-bind="value: household().StreetAddress" />
</div>

注意1:()之后不需要StreetAddress,因为KO可以自动解包表达式的最后一个属性。

Not2:您没有收到错误,因为household存在,因此调用household.StreetAddress只返回undefined是有效的,因此您不会在UI上看到任何内容