1
上下文:我很喜欢我认为的“严肃的javascript/jquery编码”,我以前的尝试可能会被认为是叛逆:P。扩展javascript通用视图模型。 (Knockout)
我的问题:我注意到我们的一些客户端视图模型中的模式,并希望将它们中的一些整合到一个.js文件中。
一切似乎是工作的大多数情况下,除了在那里我需要创建一个额外的可观测值的画面,不一定映射到从服务器返回我的JS对象。
var AdminPages = AdminPages || {};
AdminPages.SimplePageVM: function (options) {
var self = this;
self.hasChanges = function() {};
self.isValid = function() {};
// CRUD Actions
self.get = function() {
$.ajax({
url: options.getUrl,
dataType: 'json',
data: !$.isEmptyObject(options.someId) ? { someId: options.someId} : null,
success: function (result) {
self.observables = ko.mapping.fromJS(result);
ko.editable(self.observables);
ko.applyBindings(self, $('form')[0]);
},
error: function (result) {}
});
};
self.save = function() {};
self.edit = function() {};
self.cancel = function() {};
// Initialise the viewmodel on create
self.get();
}
我想将以下内容添加到视图模型中。我想我需要创建一个全新的对象,(因为self.observables只会在get函数成功时创建),然后将我的新对象及其属性添加到item绑定。
什么我还想补充:
self.newObject.IsPercentageEvaluation =
ko.computed(function() {
var isPercentage = self.observables.IsPercentageBased() == 'true';
if (isPercentage) {
self.observables.BalancePercentage('40');
} else {
self.observables.BalancePercentage('');
}
return isPercentage;
});
,并呼吁这一切:
$(function() {
var obj = {
IsPercentageEvaluation = ko.computed(...);
};
AdminPages.SimplePageVM({
getUrl: '@Url.Action("Get", "SomeController")',
editUrl: '@Url.Action("Update", "SomeController")',
organisationId: '@ViewBag.OrganisationID',
newObject: obj
});
} ($));
我只是想确认这是否是接近这种情况的正确方法是什么?或者,如果有更好的方法,例如使用某种特定的Java脚本模式,或者达到那种程度?
我误解你的第一个观点@第一,否则我会接受更快......谢谢你,我想我会尝试可覆盖的功能/钩选项。关于你的第二点,如果你们还没有解决这个问题,我使用amplify来挂钩我们创建的全局事件,该事件管理我们在应用程序中获得的通知栏。 –
介绍如何创建可覆写的功能。 到目前为止,我的最佳尝试是这样的。 self.observables = ko.mapping.fromJS(result); ko.mapping.fromJS(options.customObservables,self.observables); ....但它不工作,因为我没有访问自我。观察对象当我创建自定义计算/观察值时 –
定义像hasChanges函数一样的函数。从ajax.success中调用它。然后,当您实例化类时,为虚拟版本分配一个新函数。如果您仍然遇到问题,我可以在今晚更新我的答案以示例 –