我有一个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构建的单页应用中,我有一个设置视图,具有不同的部分.我使用childRouter来解析不同的部分.
在这个应用程序中,许多代码都与Durandal使用的组合生命周期事件挂钩.例如,这个自定义绑定:
ko.bindingHandlers.autoFocus = {
init: function (element) {
var $element = $(element),
setFocus = function () {
$element.focus();
};
router.on('router:navigation:composition-complete', setFocus);
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
router.off('router:navigation:composition-complete', setFocus);
$element = null;
});
}
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,此自定义绑定已完美运行,将焦点设置为在显示视图时应用绑定的字段.
但是,使用子路由器,时间关闭.似乎主路由器在'router:navigation:composition-complete'加载"设置"视图时触发事件.此时,尚未显示子视图,并且具有自动聚焦绑定的元素无法获得焦点.当在设置页面之间导航时更清楚地说明这一点:在离开页面时,在旧子视图上具有自动聚焦绑定的字段获得焦点,然后显示新的子视图而没有聚焦元素.
有没有办法让子路由器也省略事件?或者可能让主路由器推迟事件直到子路由器完成?
我还读到这也适用于组合的其他阶段:例如,不会在子视图的viewmodel上调用deactivate回调.因此,在子路由器上触发事件的一般修复将是我正在寻找的理想解决方案.
提前致谢.
我希望创建一个Durandal自定义对话框,在现有的可组合视图模型周围添加带有标题和页脚的窗口框架.
我制作了customModal.html模板
<div class="messageBox">
<div class="modal-header">
<h3 data-bind="text: title"></h3>
</div>
<div class="modal-body">
<!--ko compose: { model: model, template: view }-->
<!--/ko-->
</div>
<div class="modal-footer" data-bind="foreach: options">
<button class="btn" data-bind="click: function () { $parent.selectOption($data); }, text: $data, css: { 'btn-primary': $index() == 0, autofocus: $index() == 0 }"></button>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
如您所见,我希望在customModal模板的主体内构建一个viewmodel.这样传入的视图模型不依赖于模态显示,但可以轻松使用.
我已经制作了一个这样的customModal.js模型:
define(['plugins/dialog'], function (dialog) {
var CustomModal = function (title, model, view, options) {
this.title = title;
this.model = model;
this.view = view;
this.options = options;
};
CustomModal.prototype.selectOption = function …Run Code Online (Sandbox Code Playgroud) SPA的缺点当然是初始加载时间.
例如,我用Durandal创建了AskACarPro.com.
它在加载时当前有一个"加载"屏幕.但我想也许这是一个坏主意.这让我想起了一个全闪存的网站 - 非常漂亮,但没有人想在他们第一次到达网站时观看加载微调器.
我随机发现的另一个例子是MyBestEgg.com它是一个Angular网站.没什么特别的,但是我的机器上的冷加载时间差不多是6秒.
但它没有飞溅,所以屏幕在加载时会跳跃一下.我不知道这比闪屏更好.
处理不可避免的SPA加载时间是否有最佳实践?显然应该尽可能捆绑和缩小应用程序,但应用程序启动时总是会有延迟.
这可能更像是设计师类型的问题,而不是编程问题.然而,重要的是因为负载因素是不使用SPA的原因.
我正在使用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,我该怎么做?
注意.有问题的视图模型是瞬态的,而不是单例.
Visual Studio任务运行器无法加载gulp文件.我现在使用的是VS2017 v15.9.4,但该项目是在几年前开发的.
Failed to run "...\Gulpfile.js"...
cmd.exe /c gulp --tasks-simple
assert.js:350
throw err;
^
AssertionError [ERR_ASSERTION]: Task function must be specified
at Gulp.set [as _setTask] (...\node_modules\undertaker\lib\set-task.js:10:3)
at Gulp.task (...\node_modules\undertaker\lib\task.js:13:8)
at Object.<anonymous> (...\gulpfile.js:34:6)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
Run Code Online (Sandbox Code Playgroud)
我用"......"替换了我的项目本地地址
npm -v --> 6.4.1
node -v --> 10.14.2
gulp -v --> CLI version 2.0.1
Local version 4.0.0
Run Code Online (Sandbox Code Playgroud)
package.json文件的内容:
{
"version": "1.0.0",
"name": …Run Code Online (Sandbox Code Playgroud) durandal ×10
breeze ×3
knockout.js ×3
durandal-2.0 ×2
javascript ×2
angularjs ×1
asp.net ×1
asp.net-mvc ×1
gulp ×1
hottowel ×1
modal-dialog ×1
node.js ×1
npm ×1
typescript ×1