我是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; }
}
答案 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上看到任何内容