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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 使用网页包加载ng src图像_Angularjs_Webpack - Fatal编程技术网

Angularjs 使用网页包加载ng src图像

Angularjs 使用网页包加载ng src图像,angularjs,webpack,Angularjs,Webpack,我正在加载带有角度的图像,例如 <img ng-src="{{::path-to-image}}"/> webpack如何捆绑运行时解析的图像?如果您需要通过编程生成的图像路径,这意味着您有一些逻辑期望该图像存在。换言之,你应该把这个图像看作是一条逻辑的依赖关系,因此你需要明确地要求它。 在JS代码中(例如:控制器) 在模板中: <img ng-src="{{::myCtrl.imageUrl}}"/> Webpack足够智能,可以理解动态require语句,并绑

我正在加载带有角度的图像,例如

<img ng-src="{{::path-to-image}}"/>

webpack如何捆绑运行时解析的图像?

如果您需要通过编程生成的图像路径,这意味着您有一些逻辑期望该图像存在。换言之,你应该把这个图像看作是一条逻辑的依赖关系,因此你需要明确地要求它。 在JS代码中(例如:控制器)

在模板中:

<img ng-src="{{::myCtrl.imageUrl}}"/>

Webpack足够智能,可以理解动态
require
语句,并绑定与该表达式匹配的图像。
查看文档了解更多详细信息:)

因为我也需要这些功能,发现原来的答案远非完美的解决方案,我最终自己找到了答案

在控制器中写入函数:

$scope.loadImage = function(image) {
    return require('/images/' + image);
};
并在您的ng src中使用它:

<img ng-src="{{loadImage('myImage')}}" />

在这之后,要使动态需要工作,您可以使用

例如:

我创建了一个
uiImage
指令,
需要这些图像

 function uiImage() {
    return {
      restrict: 'A',
      link: function(scope, element, attr) {
        var src = attr.uiImage || attr.src;

        function loadImage(image) {
          return require(`Images/${image}`);
        }

        // required for webpack to pick up image
        element.attr('src', loadImage(src));
      }
    };
  }

  uiImage.$inject = [];
  export default uiImage;
用法:

<img ui-image='myimage.png' />

我需要在运行时使用webpack生成的哈希动态解析图像,例如,
imgA.bd79a5ba.png

{
测试:/\.png$/,,
加载器:“文件加载器?名称=images/[name].[hash].[ext]',
}
我最终创建了一个alias模块,并需要以下图像:

let map = {
  'imgA': require('./images/imgA.png'),
  'imgB': require('./images/imgB.png'),
  'imgC': require('./images/imgC.png')
}
这将生成地图:

{
  'imgA': imgA.bd79a5ba.png,
  'imgB': imgB.e51f66a2.png,
  'imgC': imgC.d84ae37c.png
}
在我的组件中,我解析了地图中的url:

self.link = function link(scope) {
  scope.imageUrl = function(name) {
    function return map[name];
  }
};
然后加载图像就变得很简单了:

 <img ng-src="{{ imageUrl('imgA') }}">
然后将其导入组件模块:

import urlMap from './imageUrlMap'
console.log(urlMap.imgA)

> imgA.bd79a5ba.png

我只是使用CopyWebpackPlugin,没有任何开销

const CopyWebpackPlugin = require('copy-webpack-plugin');
// WriteFilePlugin  needed only for webpack 3-4 and webpack dev-server
const WriteFilePlugin = require('write-file-webpack-plugin');
plugins: [
  ...
  new WriteFilePlugin(),
  new CopyWebpackPlugin([
        {from: 'files', to: 'files'},
        {from: 'images-2x', to: 'images-2x'},
        {from: 'images', to: 'images'},
      ]),
]

您的建议将视图逻辑扩展到控制器中,而控制器以前不知道视图(html文件)是否和如何显示数据。对我来说,它更像是一个网页包限制,即它无法处理在运行时解决的资源。我想我会求助于gulp将我的静态资产复制到dist/文件夹。谢谢。事实上,我对此有复杂的感觉。但实际上Webpack可以处理它(如我所示,通过require()调用)。这更像是一个html加载程序限制,因为它没有考虑src(或ng src)属性中的角度表达式。还有一句话:通过依赖外部工具来复制/构建资产,您隐藏了代码(html)和图像之间的依赖关系。对我来说,这就像在全局范围中使用$(并期望它在那一点上已经定义),而不是使用
var$=require('jquery')显式地要求它我们不习惯这样认为这类资产(字体、图像、样式),但毕竟css和其他文件加载器是为之而设计的。我同意,但这又归结为加载器。如果将加载程序配置为散列文件内容,则无法在html中反映这一点。另一方面,我不想为静态和动态引用的图像配置不同的加载程序,以及其他开发人员的开销。这种类型的“全局”依赖关系使我的代码库和开发过程保持简单,而前缀是“:”?聪明的解决方案!谢谢你的分享,这对我来说真是太好了。再次感谢您错过了
ng src
中的
{{}}
,您是对的!谢谢你的反馈,我修复了它。为什么它与DOM有关?加载例如json文件或图像有什么区别?
 <img ng-src="{{ imageUrl('imgA') }}">
export default {
  'imgA': require('./images/imgA.png'),
  'imgB': require('./images/imgB.png'),
  'imgC': require('./images/imgC.png')
}
import urlMap from './imageUrlMap'
console.log(urlMap.imgA)

> imgA.bd79a5ba.png
const CopyWebpackPlugin = require('copy-webpack-plugin');
// WriteFilePlugin  needed only for webpack 3-4 and webpack dev-server
const WriteFilePlugin = require('write-file-webpack-plugin');
plugins: [
  ...
  new WriteFilePlugin(),
  new CopyWebpackPlugin([
        {from: 'files', to: 'files'},
        {from: 'images-2x', to: 'images-2x'},
        {from: 'images', to: 'images'},
      ]),
]