2013-04-02 30 views
1

我是Durandal /微風/淘汰賽的新手,並且試圖在項目中使用它們,但我很早就陷入了困境。ko.observable在Durandal/KO /微風中不更新

目前我有一個單一的視圖(#/家庭/新)來創建一個新的家庭。我已經從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(); 
    } 
}); 

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

回答

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被任何你不得到一個錯誤

+0

*嘆*蕩!我知道這是明顯的,我失蹤了。這就是它所需要的。謝謝!我欠你一杯啤酒。 – adamlj