我有一个带有区域的互联网应用程序mvc4,对于我的组织,每个区域代表一个SPA,通过"管理NuGet包",我安装了"Durandal 1.2.0","Durandal Transitions 1.2.0"和"Durandal Router 1.2.0".我组织了文件夹并退出Durandal文件夹"App"中的"views"和"viewmodels",并将新视图放在mvc4区域的文件夹"VIews"中,例如:
领域 - > NewArea - >查看 - > ControllerFolder - >视图 - > shell.html
然后我将'"viewmodels"放在"Script"文件夹中,例如:
脚本 - > NewArea - > ControllerFolder - >的ViewModels - > shell.js
脚本 - > NewArea - > ControllerFolder - > main.js
然后我改变了durandal JS的路径,例如在main.js中:
define(['../../../App/durandal/app',
'../../../App/durandal/viewLocator',
'../../../App/durandal/system',
'../../../App/durandal/plugins/router',
'../../../App/services/logger'],
Run Code Online (Sandbox Code Playgroud)
我在下一行改变了main.js:
viewLocator.useConvention('viewmodels', '../Areas/NewArea/Views/ControllerFolder/views');
Run Code Online (Sandbox Code Playgroud)
但是文件夹的配置失败,因为下一行在其定义中调用了模块"viewLocator"的不同时间,并使用默认值重写"useConvention"的配置:
app.setRoot('viewmodels/shell', 'entrance');
Run Code Online (Sandbox Code Playgroud)
仅当文件夹"views"和"viewmodels"不在"Durandal"的"App"文件夹下时才会发生这种情况.
请帮助我,如何在同一个项目中拥有各种SPA?
我之前使用过Knockout模板,所以我不确定为什么这对我不起作用.我尝试了两种不同风格的ko标记,但都没有工作.
<!-- more nesting levels -->
<div class="cal-day-tps" data-bind="foreach: timePeriods">
<div class="cal-day-tp-cont">
<div data-bind="template: { name: 'tp-ed-templ', data: $data }"></div>
//both of these methods fail
<!-- ko template: { name: 'tp-ed-templ', data: $data } -->
<!-- /ko -->
</div>
</div>
<!-- /more nesting levels -->
<script type="text/html" id="tp-ed-templ">
<!-- bunch of markup -->
</script>
Run Code Online (Sandbox Code Playgroud)
我刚收到错误"无法找到ID为tp-ed-templ的模板".
可能只是一个错字,但我一直无法找到它.
这似乎是Durandal的一个问题,而不是Knockout.
我在vanilla durandal设置中尝试了一些非常简单的案例,它仍然做同样的事情.甚至尝试将脚本放在与绑定相同的嵌套位置,没有骰子.
我的基于durandal的SPA在viewmodels的activate函数中进行各种异步ajax调用.我正在使用来自activate函数的Q返回一个promise.
function activate(){
return Q.fcall(['getPersons', 'getAgenda']);
}
function getPersons(){
var defer = Q.defer();
$.ajax({
//omitting most of the settings
success: function(data){
defer.resolve(data);
},
error: function(xhr, status){
defer.reject(status);
}
});
return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)
getAgenda函数中也存在类似的代码.所有这一切都很好,我的屏幕转换.麻烦的是,我的getAgenda需要一段时间(2到3秒).没有出现闪屏,屏幕在转换之前保持2或3秒的位置.
我的启动画面很简单,并且确实显示了网站第一次加载.有任何想法吗?
我喜欢Durandal和KO框架,我发现它们是一个更优雅,更简单的解决方案.
然而,与谷歌背后的Angular享有更好的营销成功,因此更多的自定义选择.
现在在离子的KO端有一些等价的东西吗?或者战争已经赢了,我只需要继续前进.
我有一个SPA应用程序(durandaljs),我有一个特定的路由,我映射我想要获取的实体的"id".
模板是"/#/ todoDetail /:id".
例如,"/#/ todoDetail/232"或"/#/ todoDetail/19".
在viewmodel的激活功能上,我得到了路由信息,所以我可以获取id.然后我创建了一个breezejs EntityManager的新实例来获取具有给定id的实体.
问题是当我调用manager.fetchEntityByKey("Todos",id)时,EntityManager还没有来自服务器的元数据,所以它抛出异常"无法通过名称找到'Type':Todos".
只有在调用fetchEntityByKey之前首先对存储(manager.executeQuery)执行查询时,它才有效.
这是预期的行为还是错误?在实例化EntityManager期间有没有办法自动生成元数据?
注意:我认为在我的情况下很难使用共享的EntityManager,因为我想允许用户直接在浏览器上键入路由.
编辑:作为临时解决方法,我这样做:
BreezeService.prototype.get = function (id, callback) {
var self = this;
function queryFailed(error) {
app.showMessage(error.message);
callback({});
}
/* first checking if metadatastore was already loaded */
if (self.manager.metadataStore.isEmpty()) {
return self.manager.fetchMetadata()
.then(function (rawMetadata) {
return executeQuery();
}).fail(queryFailed);
} else {
return executeQuery();
}
/* Now I can fetch */
function executeQuery() {
return self.manager.fetchEntityByKey(self.entityType, id, true)
.then(callback)
.fail(queryFailed);
}
};
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将表格行<tr>模板传播到<tbody>标记中.这是一个例子:
HTML:
<table>
<tbody data-bind="template: { name : 'tableTemplate', foreach : tableRow }">
</tbody>
</table>
<script type="text/html" id="tableTemplate">
<tr>
<!-- First Name -->
<td data-bind="text: firstName"></td>
<!-- Last Name -->
<td data-bind="text: lastName"></td>
</tr>
</script>
Run Code Online (Sandbox Code Playgroud)
DurandalJS:
define(function(require) {
var self = this;
self.app = require('durandal/app');
return {
tableRow: ko.observableArray([
{ firstName: "DemoFirstName" , lastName: "ExampleLastName" },
{ firstName: "ExampleFirstName", lastName: "DemoLastName" }
]);
//viewAttached and other non-applicable console log functions here
};
});
Run Code Online (Sandbox Code Playgroud)
HTML中的所有内容都将正确地进行数据绑定,直到它到达表中; 所有数据绑定事后都会死亡.
我对Durandal很新,我正在学习.
我用Durandal和Breeze开发了一个ASP.NET MVC解决方案.我需要将前端翻译成法语和荷兰语.如何进行Durandal /淘汰赛?
在经典的ASP.NET MVC解决方案中,我们有机会将视图呈现在服务器端(感谢razor).
谢谢你的帮助.
我用Durandal/breeze开发了一个asp.net解决方案.
这是我的代码,以获取我的所有托运人:
var query = EntityQuery.from('Shippers')
.select('id, name, street, city');
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
Run Code Online (Sandbox Code Playgroud)
这是相关的模型:
public class Shipper
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public string Number { get; set; }
public City City { get; set; }
}
public class City
{
public int Id { get; set; }
public string Name { get; set; }
public string PostCode { get; set; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用durandal,我需要getModuleId通过传递当前模块.我的问题是,当我使用TypeScript时,从AMD模块返回的底层对象似乎无法通过Typescript代码访问:
export function checkModule(){
var a = system.getModuleId(??);
}
Run Code Online (Sandbox Code Playgroud)
编译后的TS将转换为:
function checkModule(){
var a = system.getModule(??);
}
exports.checkModule = checkModule;
Run Code Online (Sandbox Code Playgroud)
而不是??我需要传递exports在编译TS中定义的对象.无论如何要做到这一点还是有一个简单的方法?谢谢
我正在使用durandal和requirejs来构建我的视图模型.deactivate每次我离开视图时,我也会进入组合生命周期回调方法.我想在这个方法中处理我的viewmodel.
我试过了delete this,this = undefined但它们似乎没有用.
我也使用这样的durandal事件聚合器:
self.activate = () => {
App.trigger("testEvent");
};
App.on("testEvent").then(() =>
{
alert('Event Triggered!');
});
Run Code Online (Sandbox Code Playgroud)
因此,每次加载视图模型时,都会触发事件.现在,如果我离开视图,然后导航回来(因此视图模型将再次加载),然后事件将被触发两次.如果我第三次导航到视图,事件将被触发3次,依此类推.所以之前的视图模型仍然存在,这就是每个视图模型触发durandal事件的原因.因此,要解决此问题,我需要在停用时处置viewmodels,我该怎么做?
注意.有问题的视图模型是瞬态的,而不是单例.
durandal ×10
breeze ×3
javascript ×3
knockout.js ×3
angularjs ×1
asp.net ×1
asp.net-mvc ×1
hottowel ×1
typescript ×1