我有Durandal viewmodel工作方式如下:
define(function (require) {
var http = require('durandal/http');
return {
subjectItem: function (data) {
var self = this;
self.Subject_ID = data.Subject_ID;
self.Subject_Name = data.Subject_Name;
},
subjects: ko.observableArray([]),
activate: function () {
var self = this;
http.ajaxRequest("get", "/api/values/getsubjects")
.done(function (allData) {
var mappedSubjects = $.map(allData, function (list) { return new self.subjectItem(list); });
self.subjects(mappedSubjects);
});
}
};
});
Run Code Online (Sandbox Code Playgroud)
但是,在首次导航到此视图时,它会运行ajax调用但不会更改dom,再次导航到它并且它们都会出现(仍然运行ajax调用).这是我的HTML:
<table>
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody data-bind="foreach: subjects">
<tr>
<td data-bind="text: Subject_Name"></td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
任何线索,我对使用Durandal很新,但现在担心它不会有效地保持dom更新.
使用Durandal为单页应用程序创建BreezeJS EntityManager实例的最佳实践是什么?
是否应该在所有页面之间共享一个实体管理器实例,或者每个页面应该有一个实例?
有关实施的任何细节都表示赞赏.
我有这样的durandal shell视图:
<div id="global">
<!-- ko compose: {view: 'nav'} -->
<!-- /ko-->
<div id="main" class="container">
<!--ko compose: {model: router.activeItem,
afterCompose: router.afterCompose,
transition: 'entrance'} -->
<!-- /ko-->
</div>
<div id="push"></div>
</div>
<!-- ko compose: {view: 'footer'} -->
<!-- /ko-->
Run Code Online (Sandbox Code Playgroud)
'nav'和'footer'是单独的html视图.当我运行网站时它工作正常,除了从未显示页脚html.但是,当我这样说时,页脚正在显示(虽然页面布局当然是错误的):
<div id="global">
<!-- ko compose: {view: 'nav'} -->
<!-- /ko-->
<!-- ko compose: {view: 'footer'} -->
<!-- /ko-->
<div id="main" class="container">
<!--ko compose: {model: router.activeItem,
afterCompose: router.afterCompose,
transition: 'entrance'} -->
<!-- /ko-->
</div>
<div id="push"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
当我将页脚的html代码直接粘贴到shell中时,它当然也能正常工作.
我试图<!--ko if:IsShowData==true -->在热毛巾模板中使用像knockoutjs 这样的无容器语句但是如果我使用像div这样的元素的可见绑定那么它就不用了,那么它工作得非常好.(<div data-bind="visible: IsShowData==true"></div>)
任何人都可以告诉我,如果无格式的knockoutjs声明在热毛巾模板中不起作用吗?
在Default Hot towel模板中,我在home.html和home.js中添加了几行,如下所示:
views/home.html
<section>
<h2 class="page-title" data-bind="text: title"></h2>
</section>
<!-- ko if: active()==true -->
hiiiiiiiiiiiiiii
<!--/ko-->
<div data-bind="visible: active() == true">
byeeeeeeeeeeeee
</div>
Run Code Online (Sandbox Code Playgroud)
并在viewmodels/home.js文件中
define(['services/logger'], function (logger) {
var vm = {
activate: activate,
active:ko.observable(false),
title: 'Home View'
};
return vm;
//#region Internal Methods
function activate() {
logger.log('Home View Activated', null, 'home', true);
return true;
}
//#endregion
});
Run Code Online (Sandbox Code Playgroud)
我会看到hiiiiiiii但我不会看到byeeeeee
在我看来......这样的初始路线是通过以下方式定义的:
{ route: '', moduleId: 'viewmodels/customers', title: 'customers', nav: true },
Run Code Online (Sandbox Code Playgroud)
当应用程序加载''必须奇怪地设置为空的路由时,最初加载此路由.
当我现在导航到mysite /#/ customers时,没有任何内容被加载.
如何为我的路线提供一个起始模块,我可以用它来导航到它?
在旧路由器中我使用了startModule,但我在durandal 2.0中找不到它.
Durandal路线中Asterix的目的是什么?以下是文档中的示例:
route:'knockout-samples*details'
Run Code Online (Sandbox Code Playgroud)
编辑:使用Durandal 2.0
sammy.js single-page-application durandal durandal-navigation durandal-2.0
在我的durandal应用程序中,除主页之外的每个页面都有一个左侧导航栏.这个左侧导航栏应该在刷新时更新,但它应该驻留在shell.html上.
问题是我无法在主页上正确隐藏它.当我在主页上时,我可以使用jquery hide()方法隐藏leftnav div,但问题是我只能在data-bindind之后使用jquery代码,直到我可以看到导航栏.我试图使用durandal组合,但我不知道如何只在主页中隐藏导航栏,因为我不知道如何知道我是否在主页上或不在shell.js内.
任何想法?
每次我阅读有关 Javascript 的新内容时,我都会阅读有关 Durandal 和 Aurelia 的内容。我在很多博客上听到开发人员要求从 Durandal 升级到 Aurelia 或类似的版本。虽然我确实有一个想法,但我对这两者的真正含义以及它们之间的关系感到困惑,或者它们是否有关系。
这是我的看法。Durandal 是一个轻量级的 SPA 框架,它允许您利用其他 JS 库和实用程序的优点来构建应用程序。所以它本身并不是一个完整的包(与 Angular 不同),但可以使用不同的外部 JS 库 - 例如用于绑定的 Knockout、用于 DOM 的 jQuery、用于路由的 Sammy 等。
另一方面,Aurelia 是混淆的来源。它也是 SPA 框架吗?还是仅限于作为客户端(前端)框架?更让我困惑的是,有一个Durandal 博客只讨论了 Aurelia。我从互联网上知道,Rob Eisenberg 在开始研究 Aurelia 之前曾在 Durandal 工作过。那么Aurelia是Durandal的升级版,还是完全不相关的东西?
我仍然有一些问题,但我猜到目前为止我的问题的结构只会要求自以为是的答案。所以在这个问题结束之前,任何有关的描述、链接和参考都将是惊人的。我一定会在这里更新并添加有用的链接。
我有这样的Shell html
<div data-bind="compose: { model: 'ui/user/viewmodels/header', view: 'infoveave/user/views/header'}"></div>
<div class="container-fluid page-host">
<!--ko compose: {
model: router.activeItem,
afterCompose: router.afterCompose,
transition:'entrance'
}--><!--/ko-->
</div>
Run Code Online (Sandbox Code Playgroud)
和shell js一样
define(function(require) {
var router = require('durandal/plugins/router'),
system = require('durandal/system'),
return {
router: router,
activate: function () {
var self = this;
router.mapAuto('ui/user/viewmodels');
system.log('Sheel Activate Called');
return router.activate('dashboard');
}
};
});
Run Code Online (Sandbox Code Playgroud)
问题是标题上的激活函数没有被调用,但是仪表板上的那个被调用,我必须在标题中获取一些ajax内容并绑定它,我怎样才能实现这一点
我想保持这个逻辑分离,因为我不希望我的shell有这个逻辑
作为参考我的标题(为简化我已将我的复杂模型转换为一个简单的observable
define(function (require) {
var router = require('durandal/plugins/router'),
system = require('durandal/system');
this.userInfo = ko.observable('');
return {
router: router,
activate: function () {
system.log('Got Called …Run Code Online (Sandbox Code Playgroud) 由于Durandal,我开发了SPA.在此模板中,我们可以定义从一个页面导航到另一个页面时使用的过渡.过渡样式在主模块中为所有过渡样式定义,并用于所有过渡.
我想知道是否可以对某些特定视图使用不同的转换?
任何的想法?
谢谢.
durandal ×10
breeze ×2
durandal-2.0 ×2
hottowel ×2
knockout.js ×2
asp.net-mvc ×1
aurelia ×1
javascript ×1
jquery ×1
sammy.js ×1