1

我是 Durandal/breeze/knockout 的新手,并试图在项目中使用它们,但我很早就被卡住了。

目前我有一个单一的视图(#/household/new)来创建一个新的家庭。我从 api 中获取了微风元数据,然后运行 ​​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();
    }
});

主数据服务

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; }
}
4

1 回答 1

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:你不需要()after,StreetAddress因为KO可以自动解包表达式的最后一个属性。

Not2:你不会收到错误,因为household存在所以调用它是有效的,household.StreetAddress它只是返回undefined,所以你不会在 UI 上看到任何东西

于 2013-04-02T04:41:23.147 回答