Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS+;RequireJS+;面向功能的目录结构-如何在templateUrl中使用相对路径?_Angularjs_Requirejs_Amd_Angular Ui Router - Fatal编程技术网

AngularJS+;RequireJS+;面向功能的目录结构-如何在templateUrl中使用相对路径?

AngularJS+;RequireJS+;面向功能的目录结构-如何在templateUrl中使用相对路径?,angularjs,requirejs,amd,angular-ui-router,Angularjs,Requirejs,Amd,Angular Ui Router,我看到过很多帖子建议在angular中为每个特性使用一个目录。今天我将RequireJS(AMD)添加到我正在开发的一个新的angular应用程序中。我在body标签的末尾使用了script标签,然后我做了一些AMD重组,一切都神奇地改善了300% 这一切都很顺利,AMD风格的在处理JS文件时需要支持相对路径,但是使用templateUrl,它从根目录开始,而不是从我所在的目录开始。我见过类似于阅读“”的解决方案,我怀疑这种方法是否适用于AMD 有什么我不知道的把戏可以从某处穿过这条路吗?我不介

我看到过很多帖子建议在angular中为每个特性使用一个目录。今天我将RequireJS(AMD)添加到我正在开发的一个新的angular应用程序中。我在
body
标签的末尾使用了
script
标签,然后我做了一些AMD重组,一切都神奇地改善了300%

这一切都很顺利,AMD风格的
在处理JS文件时需要支持相对路径,但是使用
templateUrl
,它从根目录开始,而不是从我所在的目录开始。我见过类似于阅读“”的解决方案,我怀疑这种方法是否适用于AMD

有什么我不知道的把戏可以从某处穿过这条路吗?我不介意对每个文件做一些工作,但我真的不想在我使用
templateUrl
的任何地方做类似
templateUrl:baseUrl+'template.view1.html'
的事情


如果有必要的话,我正在使用ui路由器(第一天,耶)。

我正在使用类似的东西

angular.module('...', ['...'])
    .constant('basePath', 'app/path/to/something/')
后来

templateUrl: basePath + 'morePath/myFile.html',
我有一个小项目,尝试将RequireJS和Angular混合在一起。我在其中编写了
templateCache
AMD插件,作为:

require(['templateCache!./navbar.html',...], function(navbarTemplate, ...) {...});
因此,加载了正确的模板(使用RequireJS的
text!
插件,因此也可以使用r.js进行编译)。您得到的对象(上例中的
navbertemplate
参数)有两个属性,一个是实际加载的文本,另一个是URL,文本在URL下注册到Angular的
templateCache
。然后,您可以将其用作:

require(['templateCache!./navbar.html',...], function(navbarTemplate, ...) {
    ...
    // will give you the correct URL, with `./` expanded properly
    // the text is already registered with Angular
    templateUrl: navbarTemplate.path
    ...
});
不幸的是,我还没有开始使angular require lazy与ui路由器兼容,所以您不能按原样使用它。插件的代码(非常小)可能会让您对自己实现此功能有所了解:

define(["module", "./currentModule"], function(module, currentModule) {
    "use strict";

    /** RequireJS module loader entry point. */
    function load(name, parentRequire, onload, config) {
        parentRequire(["text!" + name], function(t) {
            if( !config || !config.isBuild ) {
                currentModule.run(["$templateCache", function($templateCache) {
                    $templateCache.put(name, t);
                }]);
            }
            onload({
                text: t,
                path: name
            });
        });
    }

    return {
        load: load
    };
});

(当前模块是特定于角度要求的,您必须至少用当前角度模块替换它。)

如何使用
require.toUrl(…)


看看官方文档:

好的一面是,您可以使用依赖注入。这在我的三行示例中是不可见的,但对感兴趣的读者来说:-还有一个侧面的注意:当然,也可以使用工厂,从中获得可能更动态的值。对我来说,常量方法工作得很顺利。每次使用
templateUrl
时,我都必须记住将基本路径粘附到相对路径,并分别传递每个功能目录的路径,因为我选择了面向功能的目录结构。我希望有更干净的东西。这是一个好方法,但我真的希望避免所有这些模板的要求污染文件的顶部。我现在意识到我可以用
文本的相对路径来工作插件(直到现在我才知道,我才开始使用r.js)是的,重新审视你的案例,可能需要
文本/html,然后将其用作
模板:file